导读:本期聚焦于小伙伴创作的《在JavaScript中,如何实现数据的加密、解密和哈希运算?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在JavaScript中,如何实现数据的加密、解密和哈希运算?》有用,将其分享出去将是对创作者最好的鼓励。

在JavaScript中实现数据的加密、解密和哈希运算,主要依赖浏览器和Node.js环境都支持的Crypto API,该API提供了安全可靠的密码学操作能力,无需引入第三方库即可完成基础的安全处理需求。

在JavaScript中,如何实现数据的加密、解密和哈希运算?

哈希运算实现

哈希运算是将任意长度的数据转换为固定长度的哈希值,常用于数据完整性校验、密码存储等场景,哈希值是不可逆的,无法通过哈希值还原原始数据。

使用Crypto API实现哈希运算的步骤如下:

  • 获取Crypto对象实例
  • 将待处理的数据转换为ArrayBuffer格式
  • 调用digest方法指定哈希算法生成哈希值
  • 将生成的ArrayBuffer转换为可读的字符串格式

以下是SHA-256哈希运算的示例代码:

// 待哈希的原始数据
const rawData = "需要计算哈希的字符串内容";
// 将字符串转换为Uint8Array
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(rawData);
// 调用Crypto API的digest方法计算SHA-256哈希
async function calculateHash() {
    const hashBuffer = await crypto.subtle.digest("SHA-256", dataBuffer);
    // 将ArrayBuffer转换为十六进制字符串
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join("");
    return hashHex;
}
// 执行函数输出结果
calculateHash().then(hash => console.log("SHA-256哈希值:", hash));

对称加密与解密实现

对称加密是指加密和解密使用同一个密钥,适合对本地存储的敏感数据或者短距离传输的数据进行保护,常用的对称加密算法有AES。

实现对称加密解密的流程分为密钥生成、加密、解密三个步骤:

  1. 生成或导入对称加密密钥
  2. 使用密钥和指定算法对数据进行加密,得到密文
  3. 使用相同密钥对密文进行解密,还原原始数据

以下是AES-GCM算法的加密解密示例代码:

// 生成AES密钥,算法为AES-GCM,密钥长度256位
async function generateKey() {
    return await crypto.subtle.generateKey(
        {
            name: "AES-GCM",
            length: 256
        },
        true, // 密钥是否可提取
        ["encrypt", "decrypt"] // 密钥用途
    );
}
// 加密函数
async function encryptData(key, data) {
    const encoder = new TextEncoder();
    const encodedData = encoder.encode(data);
    // 生成随机初始化向量
    const iv = crypto.getRandomValues(new Uint8Array(12));
    // 执行加密
    const encryptedBuffer = await crypto.subtle.encrypt(
        {
            name: "AES-GCM",
            iv: iv
        },
        key,
        encodedData
    );
    // 将iv和密文合并,方便后续解密使用
    const result = new Uint8Array(iv.length + encryptedBuffer.byteLength);
    result.set(iv);
    result.set(new Uint8Array(encryptedBuffer), iv.length);
    return result;
}
// 解密函数
async function decryptData(key, encryptedData) {
    // 提取初始化向量和密文
    const iv = encryptedData.slice(0, 12);
    const ciphertext = encryptedData.slice(12);
    // 执行解密
    const decryptedBuffer = await crypto.subtle.decrypt(
        {
            name: "AES-GCM",
            iv: iv
        },
        key,
        ciphertext
    );
    const decoder = new TextDecoder();
    return decoder.decode(decryptedBuffer);
}
// 测试加密解密流程
async function testSymmetric() {
    const key = await generateKey();
    const originalData = "需要加密的敏感数据";
    const encrypted = await encryptData(key, originalData);
    const decrypted = await decryptData(key, encrypted);
    console.log("原始数据:", originalData);
    console.log("解密后数据:", decrypted);
}
testSymmetric();

非对称加密与解密实现

非对称加密使用公钥和私钥 pair,公钥用于加密,私钥用于解密,适合在不安全通道中传输密钥等场景,常用的非对称算法是RSA。

非对称加密的实现步骤包括生成密钥对、公钥加密、私钥解密:

  • 生成RSA密钥对,指定密钥长度和用途
  • 使用接收方的公钥对数据加密,生成密文
  • 接收方使用自己的私钥对密文解密,得到原始数据

以下是RSA-OAEP算法的非对称加密解密示例代码:

// 生成RSA密钥对
async function generateRsaKeyPair() {
    return await crypto.subtle.generateKey(
        {
            name: "RSA-OAEP",
            modulusLength: 2048, // 密钥长度
            publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 公共指数
            hash: "SHA-256" // 哈希算法
        },
        true,
        ["encrypt", "decrypt"]
    );
}
// 公钥加密函数
async function rsaEncrypt(publicKey, data) {
    const encoder = new TextEncoder();
    const encodedData = encoder.encode(data);
    const encryptedBuffer = await crypto.subtle.encrypt(
        {
            name: "RSA-OAEP"
        },
        publicKey,
        encodedData
    );
    return new Uint8Array(encryptedBuffer);
}
// 私钥解密函数
async function rsaDecrypt(privateKey, encryptedData) {
    const decryptedBuffer = await crypto.subtle.decrypt(
        {
            name: "RSA-OAEP"
        },
        privateKey,
        encryptedData
    );
    const decoder = new TextDecoder();
    return decoder.decode(decryptedBuffer);
}
// 测试非对称加密解密流程
async function testAsymmetric() {
    const keyPair = await generateRsaKeyPair();
    const originalData = "非对称加密传输的数据";
    const encrypted = await rsaEncrypt(keyPair.publicKey, originalData);
    const decrypted = await rsaDecrypt(keyPair.privateKey, encrypted);
    console.log("原始数据:", originalData);
    console.log("解密后数据:", decrypted);
}
testAsymmetric();

使用注意事项

在实际使用这些密码学操作时,需要注意以下几点:

  • Crypto API的subtle方法在本地非HTTPS环境下可能无法使用,生产环境需要部署HTTPS
  • 对称加密的初始化向量需要每次随机生成,且需要和密文一起传输,不需要保密
  • 哈希运算不适合直接存储用户密码,建议结合盐值使用,提升安全性
  • 非对称加密的性能比对称加密低,通常用来加密对称密钥,而不是直接加密大量数据
密码学操作涉及数据安全,建议优先使用经过验证的原生API,避免自行实现加密算法,防止出现安全漏洞。

JavaScript加密解密哈希运算Crypto_API修改时间:2026-07-10 12:33:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。