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

哈希运算实现
哈希运算是将任意长度的数据转换为固定长度的哈希值,常用于数据完整性校验、密码存储等场景,哈希值是不可逆的,无法通过哈希值还原原始数据。
使用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。
实现对称加密解密的流程分为密钥生成、加密、解密三个步骤:
- 生成或导入对称加密密钥
- 使用密钥和指定算法对数据进行加密,得到密文
- 使用相同密钥对密文进行解密,还原原始数据
以下是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