WebCrypto API 提供加密、解密、签名等功能,支持 AES-GCM 对称加密和 RSA-OAEP 非对称加密,通过 generateKey 创建密钥,encrypt/decrypt 实现数据加解密,exportKey/importKey 管理密钥,需配合 HTTPS 与后端保障安全。

WebCrypto API 是现代浏览器提供的强大工具,用于执行常见的密码学操作,比如加密、解密、签名、哈希和密钥生成。它支持 AES、RSA、ECDSA 等多种算法,并且运行在安全的上下文中(如 HTTPS),能有效防止敏感数据暴露。下面通过实际示例展示如何使用 WebCrypto API 实现对称加密与非对称加密的基本流程。
对称加密适用于加密大量数据,加密和解密使用相同的密钥。AES-GCM 模式提供机密性和完整性验证,是推荐使用的模式之一。
生成 AES 密钥并加密字符串:
说明: 使用 crypto.subtle.generateKey() 生成一个 256 位的 AES-GCM 密钥。
代码示例:
<font face="Courier New" size="2">
async function encryptData(plainText) {
// 生成密钥
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
// 编码文本为 ArrayBuffer
const encoder = new TextEncoder();
const data = encoder.encode(plainText);
// 生成随机 IV(初始化向量)
const iv = crypto.getRandomValues(new Uint8Array(12));
// 执行加密
const encrypted = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv: iv },
key,
data
);
// 返回密文、IV 和密钥(实际中密钥不应直接返回)
return {
encrypted: Array.from(new Uint8Array(encrypted)),
iv: Array.from(iv),
key: key // 注意:生产环境应妥善管理密钥
};
}
</font>
解密数据:
说明: 使用之前保存的密钥、IV 和密文进行解密。
<font face="Courier New" size="2">
async function decryptData(encryptedData, iv, key) {
const encryptedBuffer = new Uint8Array(encryptedData).buffer;
const ivBuffer = new Uint8Array(iv).buffer;
const decrypted = await crypto.subtle.decrypt(
{ name: "AES-GCM", iv: ivBuffer },
key,
encryptedBuffer
);
const decoder = new TextDecoder();
return decoder.decode(decrypted);
}
</font>
非对称加密适合加密小量数据或传输对称密钥。公钥加密,私钥解密。
LOVESTUdio多校园网络店铺
主要更新介绍: 完美整合Discuz!论坛,实现一站式登陆、退出、注册; 同步所有会员资料; 新增购物车功能,商品购买更加方便、快捷; 新增部分快捷菜单,网站访问更加方便; 限制首页商品、店铺标题显示长度; 修正会员后台管理不能更改密码的错误; 完善商品显示页面所有功能链接; 修正后台标签管理部分错误; 修正前台学校列表不按后台顺序显示的错误; 修正搜索功能中学校名称过长导致显示紊乱的现象; 修正
0
查看详情
生成 RSA 密钥对:
说明: 创建一对公私钥,公钥可用于加密,私钥用于解密。
<font face="Courier New" size="2">
async function generateRSAKeyPair() {
return await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);
}
</font>
使用公钥加密,私钥解密:
<font face="Courier New" size="2">
async function rsaEncrypt(plainText, publicKey) {
const encoder = new TextEncoder();
const data = encoder.encode(plainText);
const encrypted = await crypto.subtle.encrypt(
{ name: "RSA-OAEP" },
publicKey,
data
);
return Array.from(new Uint8Array(encrypted));
}
async function rsaDecrypt(encryptedData, privateKey) {
const encryptedBuffer = new Uint8Array(encryptedData).buffer;
const decrypted = await crypto.subtle.decrypt(
{ name: "RSA-OAEP" },
privateKey,
encryptedBuffer
);
const decoder = new TextDecoder();
return decoder.decode(decrypted);
}
</font>
有时需要将密钥保存或传输。WebCrypto 支持以 jwk 格式导出密钥。
<font face="Courier New" size="2">
async function exportKey(key) {
const jwk = await crypto.subtle.exportKey("jwk", key);
return jwk; // 可序列化为 JSON
}
async function importKey(jwk) {
return await crypto.subtle.importKey(
"jwk",
jwk,
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
}
</font>
基本上就这些。WebCrypto API 提供了安全且标准化的方式处理前端加密任务。注意:不要在客户端依赖 J*aScript 加密来实现完整安全,它只是整体安全策略的一部分,比如防止明文传输。密钥管理、HTTPS 和后端验证同样重要。
以上就是J*aScript密码学_WebCryptoAPI加密解密实战的详细内容,更多
请关注其它相关文章!
相关文章:
淘宝网网页版登录入口 淘宝官方网页版快捷登录
淘宝支付提示失败如何解决 淘宝支付流程优化方法
微信商城在哪里打开【步骤】
yandex入口引擎手机版 yandex安卓版下载入口
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
将HTML Canvas内容转换为可上传的图像文件(File对象)
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
Mac怎么查看崩溃日志_Mac控制台错误报告分析
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
AO3最新可访问网址 Archive of Our Own官方在线入口
蛙漫安全无毒 官方认证的绿色入口
如何提高微信支付的安全性_微信支付安全防护与设置建议
126邮箱账号注册 电脑版登录入口
C++如何比较两个字符串_C++ string compare函数与操作符对比
《噬血代码2》新预告片发布 展示游戏剧情
qq游戏手机版下载安装_qq游戏移动端入口
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
ArrayList与LinkedList核心操作的Big-O复杂度分析
html5 app怎么运行环境_配html5 app运行环境【教程】
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
J*aScript实现单选按钮与关联输入框的联动禁用教程
响应式图片在网页设计中的正确实现方法
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
TikTok网页版直接登录 TikTok网页端官方平台入口
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
C++如何解决segmentation fault_C++段错误调试与原因分析
12306选座如何查看座位示意图_12306座位示意图解读与使用
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
4399免费游戏网址入口 4399小游戏免费入口点开即玩
PHP教程:高效从URL路径中提取倒数第二个片段
虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画
Go语言中高效处理x-www-form-urlencoded表单数据
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
2025-2030年全球乘用车销量预测:新能源成增长主力
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
J*aScript DOM操作:高效清空列表元素的策略与实践
Eclipse怎么运行工程_Eclipse工程运行配置说明
微博网页版官方账号登录 微博网页版内容浏览使用指南
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
Go语言中JSON数据解码与字段访问指南
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
CSS实现侧边栏导航项全宽圆角悬停背景效果
绝地鸭卫平a核爆刀流玩法攻略
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
2026年CSGO开箱网站推荐 CSGO开箱平台精选
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
基于多条件高效更新SQL表:利用CASE表达式优化业务逻辑