Web 开发中五种常用加密算法原理与实战
了 Web 开发中五种核心加密算法:AES(对称加密)、RSA(非对称加密)、SHA-256(哈希)、HMAC(消息认证)及 PBKDF2(密钥派生)。涵盖各算法原理、应用场景及 Node.js/浏览器环境下的实战代码示例,并提供算法对比表与安全最佳实践,帮助开发者构建安全的 Web 应用。

了 Web 开发中五种核心加密算法:AES(对称加密)、RSA(非对称加密)、SHA-256(哈希)、HMAC(消息认证)及 PBKDF2(密钥派生)。涵盖各算法原理、应用场景及 Node.js/浏览器环境下的实战代码示例,并提供算法对比表与安全最佳实践,帮助开发者构建安全的 Web 应用。

在现代 Web 开发中,数据安全至关重要。以下是五种最常用的 Web 加密算法,包括它们的原理、应用场景和实战代码示例。
AES 是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代 - 置换网络 (SPN) 结构,主要步骤包括:
AES 有三种密钥长度:128 位、192 位和 256 位,分别对应 10、12 和 14 轮加密。
const crypto = require('crypto');
// AES-256-CBC 加密
function encrypt(text, key, iv) {
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return encrypted.toString('hex');
}
// AES-256-CBC 解密
function decrypt(encryptedText, key, iv) {
const encryptedBuffer = Buffer.from(encryptedText, 'hex');
const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
let decrypted = decipher.update(encryptedBuffer);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
// 使用示例
const key = crypto.randomBytes(32); // 256 位密钥
const iv = crypto.randomBytes(16); // 初始向量
const message = 'Secret Message';
const encrypted = encrypt(message, key, iv);
console.log('Encrypted:', encrypted);
const decrypted = decrypt(encrypted, key, iv);
console.log('Decrypted:', decrypted);
RSA 基于大整数因数分解的困难性,主要步骤:
const crypto = require('crypto');
// 生成 RSA 密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048, // 密钥长度
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
});
// RSA 加密
function rsaEncrypt(data, publicKey) {
return crypto.publicEncrypt({
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: 'sha256'
}, Buffer.from(data)).toString('base64');
}
// RSA 解密
function rsaDecrypt(encryptedData, privateKey) {
return crypto.privateDecrypt({
key: privateKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: 'sha256'
}, Buffer.from(encryptedData, 'base64')).toString();
}
message = ;
encrypted = (message, publicKey);
.(, encrypted);
decrypted = (encrypted, privateKey);
.(, decrypted);
SHA-256 是 SHA-2 家族的一员,产生 256 位哈希值。其工作流程:
// 浏览器中使用 Web Crypto API 进行 SHA-256 哈希
async function sha256Hash(message) {
// 将字符串编码为 Uint8Array
const encoder = new TextEncoder();
const data = encoder.encode(message);
// 计算哈希
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
// 将 ArrayBuffer 转换为十六进制字符串
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return hashHex;
}
// 使用示例
sha256Hash('Hello World').then(hash => console.log('SHA-256 Hash:', hash));
HMAC 结合加密哈希函数和密钥,提供消息认证。公式为:
HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
其中:
const crypto = require('crypto');
// 生成 HMAC
function generateHMAC(message, secret) {
return crypto.createHmac('sha256', secret).update(message).digest('hex');
}
// 验证 HMAC
function verifyHMAC(message, secret, hmac) {
const expectedHmac = generateHMAC(message, secret);
return crypto.timingSafeEqual(
Buffer.from(expectedHmac),
Buffer.from(hmac)
);
}
// 使用示例
const secretKey = 'mySecretKey123';
const message = 'Important Data';
const hmac = generateHMAC(message, secretKey);
console.log('HMAC:', hmac);
const isValid = verifyHMAC(message, secretKey, hmac);
console.log('Verification:', isValid ? 'Valid' : 'Invalid');
PBKDF2 通过重复哈希增强弱密码的安全性:
const crypto = require('crypto');
// 使用 PBKDF2 派生密钥
function deriveKey(password, salt, iterations, keyLength, digest) {
return crypto.pbkdf2Sync(
password,
salt,
iterations,
keyLength,
digest
).toString('hex');
}
// 使用示例
const password = 'userPassword123';
const salt = crypto.randomBytes(16).toString('hex'); // 生成随机盐
const iterations = 10000; // 迭代次数
const keyLength = 32; // 密钥长度(字节)
const digest = 'sha256'; // 哈希算法
const derivedKey = deriveKey(password, salt, iterations, keyLength, digest);
console.log('Derived Key:', derivedKey);
console.log('Salt:', salt);
// 验证密码示例
function verifyPassword(password, storedHash, storedSalt, iterations, keyLength, digest) {
const newHash = deriveKey(password, storedSalt, iterations, keyLength, digest);
return newHash === storedHash;
}
const isMatch = verifyPassword('userPassword123', derivedKey, salt, iterations, keyLength, digest);
console.(, isMatch);
| 算法 | 类型 | 密钥长度 | 安全性 | 性能 | 适用场景 |
|---|---|---|---|---|---|
| AES | 对称加密 | 128/192/256 位 | 高 | 快 | 大数据量加密 |
| RSA | 非对称加密 | 2048 位 + | 高 | 慢 | 密钥交换、数字签名 |
| SHA-256 | 哈希算法 | 256 位输出 | 高 | 快 | 数据完整性验证 |
| HMAC | 消息认证码 | 可变 | 高 | 中等 | 消息认证 |
| PBKDF2 | 密钥派生 | 可变 | 高 | 可调 | 密码存储 |
通过掌握这五种核心加密算法及其实现,您已经具备了构建安全 Web 应用的基础能力。在实际项目中,应根据具体需求选择合适的算法组合,并遵循安全最佳实践来保护用户数据。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online