在 JavaScript 中实现数据加密与解密:Web Cryptography API 与 CryptoJS详解

在 JavaScript 中,可以使用 Web Cryptography API 或第三方库如 crypto-js 来实现加密和解密。本文将介绍如何使用这两种方法在客户端进行数据的加密和解密。

在这里插入图片描述

使用 Web Cryptography API

Web Cryptography API 是现代浏览器提供的一个强大、原生的加密 API。它允许在客户端进行加密、解密、签名和验证等操作。

生成密钥对

首先,生成一个 RSA 密钥对:

async function generateKeyPair() {const keyPair = await window.crypto.subtle.generateKey({name: "RSA-OAEP",modulusLength: 2048,publicExponent: new Uint8Array([1, 0, 1]),hash: "SHA-256"},true,["encrypt", "decrypt"]);const publicKey = await window.crypto.subtle.exportKey("spki", keyPair.publicKey);const privateKey = await window.crypto.subtle.exportKey("pkcs8", keyPair.privateKey);return {publicKey: publicKey,privateKey: privateKey};
}generateKeyPair().then(keyPair => {console.log("Public Key:", arrayBufferToBase64(keyPair.publicKey));console.log("Private Key:", arrayBufferToBase64(keyPair.privateKey));
});
加密数据

使用公钥加密数据:

async function encryptData(data, publicKey) {const publicKeyBuffer = base64ToArrayBuffer(publicKey);const cryptoKey = await window.crypto.subtle.importKey("spki",publicKeyBuffer,{name: "RSA-OAEP",hash: "SHA-256"},true,["encrypt"]);const encodedData = new TextEncoder().encode(data);const encryptedData = await window.crypto.subtle.encrypt({name: "RSA-OAEP"},cryptoKey,encodedData);return arrayBufferToBase64(encryptedData);
}
解密数据

使用私钥解密数据:

async function decryptData(encryptedData, privateKey) {const privateKeyBuffer = base64ToArrayBuffer(privateKey);const cryptoKey = await window.crypto.subtle.importKey("pkcs8",privateKeyBuffer,{name: "RSA-OAEP",hash: "SHA-256"},true,["decrypt"]);const encryptedBuffer = base64ToArrayBuffer(encryptedData);const decryptedData = await window.crypto.subtle.decrypt({name: "RSA-OAEP"},cryptoKey,encryptedBuffer);return new TextDecoder().decode(decryptedData);
}
工具函数

用于在 ArrayBuffer 和 Base64 之间转换的工具函数:

function arrayBufferToBase64(buffer) {let binary = '';const bytes = new Uint8Array(buffer);const len = bytes.byteLength;for (let i = 0; i < len; i++) {binary += String.fromCharCode(bytes[i]);}return window.btoa(binary);
}function base64ToArrayBuffer(base64) {const binaryString = window.atob(base64);const len = binaryString.length;const bytes = new Uint8Array(len);for (let i = 0; i < len; i++) {bytes[i] = binaryString.charCodeAt(i);}return bytes.buffer;
}

使用 CryptoJS

crypto-js 是一个流行的 JavaScript 库,用于实现加密和解密。它支持多种加密算法,如 AES、DES、HMAC、SHA 等。

安装 CryptoJS

首先,安装 crypto-js

npm install crypto-js
使用 AES 加密和解密
const CryptoJS = require('crypto-js');// 加密数据
function encryptData(data, secretKey) {return CryptoJS.AES.encrypt(data, secretKey).toString();
}// 解密数据
function decryptData(encryptedData, secretKey) {const bytes = CryptoJS.AES.decrypt(encryptedData, secretKey);return bytes.toString(CryptoJS.enc.Utf8);
}const secretKey = 'my-secret-key';
const data = 'Hello, World!';const encryptedData = encryptData(data, secretKey);
console.log('Encrypted Data:', encryptedData);const decryptedData = decryptData(encryptedData, secretKey);
console.log('Decrypted Data:', decryptedData);

结论

通过本文,你可以了解如何在 JavaScript 中使用 Web Cryptography API 和 crypto-js 库进行数据的加密和解密。Web Cryptography API 提供了现代浏览器中的原生加密功能,而 crypto-js 则是一个功能强大的第三方库,适用于 Node.js 和浏览器环境。如果有任何问题或需要进一步的帮助,请在评论区留言或者联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于留痕的使用常见的问题

1. 登录微信 登录要导出数据的微信&#xff08;不支持微信多开&#xff0c;不支持部分老版本微信&#xff09; 相关信息 想把手机端的微信聊天记录转移到电脑上可以使用微信自带的聊天记录迁移功能 操作步骤&#xff1a; 安卓&#xff1a; 手机微信->我->设置->聊…

Python教程-快速入门基础必看课程07-判断结构

该视频主要讲述了Python中的布尔类型值和if-else语句。 布尔类型值是Python中的基本数据类型之一&#xff0c;只有两个值&#xff1a;True和False。它们常用于进行逻辑判断。 视频中详细介绍了如何定义和打印布尔类型值&#xff0c;以及如何进行比较和判断大小等操作。 if-els…

【做一道算一道】根据身高重建队列

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

[深度学习]使用python部署yolov10的onnx模型

测试环境&#xff1a; onnxruntime1.15.1 opencv-python4.8.0.76 部分实现代码&#xff1a; parser argparse.ArgumentParser()parser.add_argument("--model", typestr, default"yolov10n.onnx", help"Input your ONNX model.")parser.add_arg…

leetcode hot100强化练习 0 - 35

Part I 哈希表 1. 两数之和 class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""if not nums:return d {}for i, n in enumerate(nums):k target - nif k not in d:d[n]…

电子电器架构 --- 什么是域控制器?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

美颜相机与美图秀秀的非会员图片保存技巧畅享专业级图像处理探索

美颜相机与美图秀秀的非会员图片保存技巧畅享专业级图像处理探索 今日对美颜相机和美图秀秀的深入使用中&#xff0c;我遇到了一些功能限制&#xff0c;特别是在尝试保存特定处理后的图片时&#xff0c;发现通常需要开通VIP会员才能享受完整服务。作为一名热衷于技术探索的爱好…

【数据结构】二叉树的层序遍历~动画超详解

目录 1 什么是层序遍历2 二叉树层序遍历的基本思路3 二叉树层序遍历的实现 1 什么是层序遍历 我们从字面意思就明白,所谓层序,就是一层一层按顺序去遍历一个二叉树,这和我们之前了解的按前中后序遍历方式完全不同 比方说这颗二叉树: 前序遍历: 层序遍历: 2 二叉树层序遍历的…

深度解析Go语言中的Slice切片

深度解析Go语言中的Slice切片 一、 简介二、数据结构三、初始化四、内容截取五、切片扩容六、元素删除七、切片拷贝 一、 简介 go中的切片&#xff0c;在某种程度上相当于别的语言中的“数组”。不同点在于切片的长度和容量是可变的&#xff0c;在使用过程中可以进行扩容。 二…

Android 使用kotlin Retrofit2 + Dagger2完成网络请求跟依赖注入组合使用

文章目录 &#xff08;一&#xff09;引入依赖&#xff08;二&#xff09;基本概念Dagger中的基本概念&#xff1a;Retrofit介绍 &#xff08;三&#xff09;Dagger2 Module 和 Provides 和 Component Inject&#xff08;四&#xff09;Retrofit2 创建数据类Bean跟Service服务&…

探索Java反射:解密动态性与灵活性

前言 Java反射是一项强大而灵活的技术&#xff0c;它使得程序能够在运行时获取类的信息、调用类的方法、访问类的字段等。本篇博客将深入探讨Java反射的原理、应用场景以及使用技巧&#xff0c;带你解密Java反射的奥秘。 什么是Java反射&#xff1f; 在传统的Java编程中&…

LabVIEW调用国产硬件DLL的稳定性问题及解决方案

在LabVIEW中调用国内公司提供的硬件DLL时&#xff0c;尽管可以运行&#xff0c;但常出现不稳定和bug问题&#xff0c;且厂家临时修改的版本未经长期测试。为确保稳定性和质量&#xff0c;需要制定系统化的测试和反馈机制、建立严格的版本控制、与厂家协作优化、并进行深入的自测…

C语言刷题(数组)

1. 编写程序利用数组实现将一个数插入到一个有序的数列中&#xff0c;要求插入后仍有序。 C语言代码 #include <stdio.h> int main(){ int n 0; printf("请输入有序数组元素的个数&#xff1a;\n"); scanf("%d",&n); //定义并输入数组 …

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 查看表的属性DESCRIBE/DESC 以表格的形式展示表属性SHOW CREATE TABLE 以SQL语句的形式展示表属性 2.2 查看表的内容 【 3. MySQL 修改数据表结构 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头…

LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks

更多精彩内容&#xff0c;请关注微信公众号&#xff1a;NLP分享汇 原文链接&#xff1a;LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks 你是怎么理解LLM的规划和推理能力呢&#xff0c;来自亚利桑那州立大学最近的一篇论文&#xff0c;对LLM的规划、推理…

RESTful API开发:Flask库设计用户认证接口的6个要点

在当今的Web开发世界里&#xff0c;RESTful API已然成为应用程序间数据交互的标准方式。它们简洁、灵活&#xff0c;使得前后端分离更加顺畅。而Flask&#xff0c;作为一款轻量级且功能强大的Python Web框架&#xff0c;无疑是构建RESTful API的理想工具。然而&#xff0c;要确…

Java面试题:如何在Java中实现线程间的通信?请列举几种常见的方式

在Java中&#xff0c;线程间的通信主要涉及到线程间的数据交换和协调。以下是几种常见的线程间通信方式&#xff1a; 共享对象&#xff1a; 线程可以通过共享对象的实例变量或方法参数来进行通信。这种方式需要特别注意线程安全&#xff0c;通常需要同步代码块或使用锁来避免并…

ios 新安装app收不到fcm推送

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Python库之Playwright简介、安装、使用方法详细攻略

Python库之Playwright简介、安装、使用方法详细攻略 引言 在自动化测试领域&#xff0c;Playwright是一个强大的库&#xff0c;它支持无头浏览器自动化&#xff0c;允许开发者在多种浏览器上进行网页自动化操作。Playwright由微软开发&#xff0c;支持Chromium、Firefox和Web…

拼图游戏完整思路(全代码演示)

主界面 小练习1&#xff1a; 一、三个界面的设置1&#xff1a;创建窗体 1、将三个主界面分开为三个类&#xff0c;每个类都去继承JFrame这个类&#xff0c;使得每个类都可以使用创建页面功能 2、对每个类进行空参构造&#xff0c;在空参构造里面进行窗体属性的赋值 3、创建一个…