新闻中心

J*aScript密码学_WebCryptoAPI加密解密实战

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

javascript密码学_webcryptoapi加密解密实战

WebCrypto API 是现代浏览器提供的强大工具,用于执行常见的密码学操作,比如加密、解密、签名、哈希和密钥生成。它支持 AES、RSA、ECDSA 等多种算法,并且运行在安全的上下文中(如 HTTPS),能有效防止敏感数据暴露。下面通过实际示例展示如何使用 WebCrypto API 实现对称加密与非对称加密的基本流程。

使用 AES-GCM 进行对称加密与解密

对称加密适用于加密大量数据,加密和解密使用相同的密钥。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>

使用 RSA-OAEP 实现非对称加密

非对称加密适合加密小量数据或传输对称密钥。公钥加密,私钥解密。

LOVESTUdio多校园网络店铺 LOVESTUdio多校园网络店铺

主要更新介绍: 完美整合Discuz!论坛,实现一站式登陆、退出、注册; 同步所有会员资料; 新增购物车功能,商品购买更加方便、快捷; 新增部分快捷菜单,网站访问更加方便; 限制首页商品、店铺标题显示长度; 修正会员后台管理不能更改密码的错误; 完善商品显示页面所有功能链接; 修正后台标签管理部分错误; 修正前台学校列表不按后台顺序显示的错误; 修正搜索功能中学校名称过长导致显示紊乱的现象; 修正

LOVESTUdio多校园网络店铺 0 查看详情 LOVESTUdio多校园网络店铺 生成 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加密解密实战的详细内容,更多请关注其它相关文章!


# java  # 按需  # 点对点  # 公钥  # 加密解密  # 非对称  # 如何实现  # crypto  # 敏感数据  # 后端  # 工具  # 浏览器  # 编码  # json  # 前端  # js  # javascript  # ai  # 网站建设与维护计划方案  # seo外链优化价格  # 手机推广引流营销软件  # seo营销询问火.星  # 网络营销推广论文总结ppt  # 崂山网络推广营销  # seo接单平台有哪些  # 江山网站制作推广  # 奶茶推广及营销策略  # seo慕课  # 有哪些  # 加载 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  qq游戏大厅官方下载_qq游戏免费下载安装入口  poki网页游戏推荐_poki免费游戏平台入口  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  React/Next.js中实现列表项的动态选择与移动  知音漫客官网漫画下载_知音漫客网页版阅读记录  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  使用J*aScript检测输入元素是否包含在特定类中  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Django表单提交验证失败后保持字段值不刷新  晋江读书网页版在线登录 晋江读书电脑版官网  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  Golang如何优雅处理error_Golang error处理最佳实践总结  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  C#中解析不规范的HTML为XML 常见的坑与解决办法  EMS快递官网app_中国邮政速递物流手机客户端  J*a中实现Go语言select通道多路复用机制  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  poki免费入口快捷访问 poki人气小游戏直接玩站点  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  邮政快递单号查询入口 邮政快递物流信息在线查询入口  基于动态规划的房屋花卉种植最小成本算法详解  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  快手极速版在线观看 官方网页版登录地址  浏览器打开即用 美图秀秀网页版入口  Node.js中HTML按钮与J*aScript函数交互的正确姿势  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  J*aScript中在Map循环中检测并处理空数组元素  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  J*a应用程序首次运行自动创建文件与目录的最佳实践  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  必由学网页版入口 必由学官方平台直接访问  Shopware订单对象中获取产品自定义字段的正确方法  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  2026春节假期票务安排_2026春节放假购票指南 

搜索