文章目录
五种常用Web加密算法实战及原理详解

  1. AES (高级加密标准)
    原理详解
    应用场景
    实战代码(Node.js)
  2. RSA (非对称加密)
    原理详解
    应用场景
    实战代码(Node.js)
  3. SHA-256 (安全哈希算法)
    原理详解
    应用场景
    实战代码(浏览器环境)
  4. HMAC (基于哈希的消息认证码)
    原理详解
    应用场景
    实战代码(Node.js)
  5. PBKDF2 (基于密码的密钥派生函数)
    原理详解
    应用场景
    实战代码(Node.js)
    加密算法对比表
    安全最佳实践
    进阶主题

五种常用Web加密算法实战及原理详解
在现代Web开发中,数据安全至关重要。以下是五种最常用的Web加密算法,包括它们的原理、应用场景和实战代码示例。

  1. AES (高级加密标准)
    原理详解
    AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构,主要步骤包括:

密钥扩展:从初始密钥派生多轮密钥
初始轮:AddRoundKey(轮密钥加)
主轮(重复9-13次):
SubBytes(字节替换)
ShiftRows(行移位)
MixColumns(列混淆)
AddRoundKey
最终轮(省略MixColumns)
AES有三种密钥长度:128位、192位和256位,分别对应10、12和14轮加密。

应用场景
HTTPS传输中的数据加密
数据库敏感字段加密
文件加密存储
实战代码(Node.js)
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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

  1. RSA (非对称加密)

原理详解
RSA基于大整数因数分解的困难性,主要步骤:

密钥生成:
选择两个大素数p和q
计算n = pq,φ(n) = (p-1)(q-1)
选择e使得1 < e < φ(n)且gcd(e, φ(n)) = 1
计算d ≡ e⁻¹ mod φ(n)
公钥=(e, n),私钥=(d, n)
加密:c ≡ mᵉ mod n
解密:m ≡ cᵈ mod n
应用场景
SSL/TLS握手过程中的密钥交换
数字签名
小数据量加密(如加密对称密钥)
实战代码(Node.js)
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();
}

// 使用示例
const message = 'Confidential Data';

const encrypted = rsaEncrypt(message, publicKey);
console.log('RSA Encrypted:', encrypted);

const decrypted = rsaDecrypt(encrypted, privateKey);
console.log('RSA Decrypted:', decrypted);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

  1. SHA-256 (安全哈希算法)

原理详解
SHA-256是SHA-2家族的一员,产生256位哈希值。其工作流程:

预处理:
填充消息使其长度为512位的倍数
附加原始消息长度
哈希计算:
将消息分成512位块
对每个块应用64轮压缩函数
使用8个初始哈希值和64个预定义常数
每轮包括消息调度、工作变量更新等操作
输出:最终8个工作变量连接形成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));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

  1. HMAC (基于哈希的消息认证码)

原理详解
HMAC结合加密哈希函数和密钥,提供消息认证。公式为:

HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
1
其中:

H是哈希函数(如SHA-256)
K是密钥
m是消息
opad是外部填充(0x5c重复)
ipad是内部填充(0x36重复)
应用场景
API请求认证
JWT签名
消息完整性验证
实战代码(Node.js)
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');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

  1. PBKDF2 (基于密码的密钥派生函数)

原理详解
PBKDF2通过重复哈希增强弱密码的安全性:

输入密码、盐值、迭代次数和期望密钥长度
对密码和盐值应用HMAC多次(迭代)
每次迭代的输出与前一次结果异或
最终组合所有块生成派生密钥
应用场景
用户密码存储
从密码生成加密密钥
实战代码(Node.js)
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.log('Password Match:', isMatch);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
加密算法对比表
算法 类型 密钥长度 安全性 性能 适用场景
AES 对称加密 128/192/256位 高 快 大数据量加密
RSA 非对称加密 2048位+ 高 慢 密钥交换、数字签名
SHA-256 哈希算法 256位输出 高 快 数据完整性验证
HMAC 消息认证码 可变 高 中等 消息认证
PBKDF2 密钥派生 可变 高 可调 密码存储
安全最佳实践
密钥管理:

永远不要硬编码密钥
使用密钥管理系统(如AWS KMS、Hashicorp Vault)
定期轮换密钥
算法选择:

对称加密首选AES-256
非对称加密使用RSA 2048位或ECC 256位+
哈希函数使用SHA-256或SHA-3
密码存储:

永远不要明文存储密码
使用PBKDF2、bcrypt或Argon2
每个用户使用唯一盐值
传输安全:

始终使用HTTPS
敏感数据在客户端也应加密
错误处理:

加密失败时不要暴露详细信息
使用恒定时间比较防止时序攻击
进阶主题
椭圆曲线加密(ECC):比RSA更高效的非对称加密
bcrypt/Argon2:更现代的密码哈希算法
量子安全加密:抗量子计算的算法(如格密码)
同态加密:在加密数据上直接计算
零知识证明:验证信息而不泄露信息本身
通过掌握这五种核心加密算法及其实现,您已经具备了构建安全Web应用的基础能力。在实际项目中,应根据具体需求选择合适的算法组合,并遵循安全最佳实践来保护用户数据。


千年单身的领结
1 声望1 粉丝