在Web前端开发中,加密是确保数据安全的重要手段,不少场景需要用到,下面盘点一下加密方式和常见的加密算法,以及推荐的库。
这里不列举base64,因为base64是一种将二进制数据转换为可打印字符的编码方式,不具备加密特性。
1. 对称加密(Symmetric Encryption)
描述:
算法: AES, DES。
加密/解密原理:加密和解密都使用同一个密钥。
优点: 加密解密速度快,适合大数据量。
缺点: 密钥的分发和管理比较麻烦,而且密钥泄露会导致所有数据都暴露。
安全性: 高,但密钥必须严格保密,密钥泄露会导致数据被解密。
使用场景: 适用于需要对数据进行加密传输的场景,如敏感信息的加密存储、传输。
推荐第三方库: crypto-js, sjcl (Stanford Javascript Crypto Library), forge
代码示例:
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32); // 256-bit key
const iv = crypto.randomBytes(16); // Initialization vector
function encrypt(text) {
let cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return { iv: iv.toString('hex'), encryptedData: encrypted };
}
function decrypt(encryptedText) {
let iv = Buffer.from(encryptedText.iv, 'hex');
let encryptedData = Buffer.from(encryptedText.encryptedData, 'hex');
let decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
2. 非对称加密(Asymmetric Encryption)
描述:
算法: RSA, ECC。
加密/解密原理:使用公钥加密数据,使用相对应的私钥解密数据。
优点: 公钥可公开传播,私钥保密即可,无需共享密钥。
缺点: 加密和解密速度慢,适合小数据量。
安全性: 高,密钥长度影响安全性。
使用场景: 适合用于加密少量的数据,特别是在需要确保数据接收者唯一性的场景,如数字签名、身份验证。
推荐第三方库: node-rsa, jsrsasign, forge
代码示例:
const NodeRSA = require('node-rsa');
const key = new NodeRSA({b: 512}); // 512位密钥
// 加密
const publicKey = key.exportKey('public');
const encrypted = key.encrypt('Text to encrypt', 'base64');
// 解密
const privateKey = key.exportKey('private');
const decrypted = key.decrypt(encrypted, 'utf8');
3. 哈希算法(Hashing Algorithm)(摘要算法)
描述:
算法: SHA-256, MD5。
加密原理: 将输入数据映射为固定长度的哈希值(通常为不可逆)。
解密原理: 无法解码,散列算法是单向的。
优点: 高效的哈希计算,适合用于数据完整性检查和密码存储。
缺点: 一旦发生哈希碰撞(极少),可能导致数据冲突。
安全性: 高,但容易受彩虹表攻击,通常与加盐(salt)技术结合使用,一般仅用于校验与签名。
使用场景: 常用于密码存储和数据完整性验证,确保数据在传输和存储过程中未被篡改。
推荐第三方库: crypto-js, jsSHA, hash.js
代码示例:
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('password').digest('hex');
console.log(hash); // 输出哈希值
4. HMAC (Hash-based Message Authentication Code) (哈希消息认证码)
描述:
算法: HMAC (基于哈希函数),一种结合了密钥和哈希函数进行消息认证的方法。
加密原理: 使用散列函数和密钥生成消息认证码。
解密原理: 使用相同的密钥验证消息认证码。
优点: 有效防止消息篡改和伪造,计算效率高。
缺点: 需要安全地管理和共享密钥。
安全性: 高,非常适合用于消息的身份验证,依赖于密钥安全。
使用场景: 用于API请求签名、消息认证码等需要确保消息完整性和身份验证的场景。
推荐第三方库: crypto-js, tweetnacl
代码示例:
const crypto = require('crypto');
const secret = 'my_secret_key';
const hash = crypto.createHmac('sha256', secret).update('message').digest('hex');
console.log(hash); // 输出HMAC
5. 国密
描述:
国密涉及到多种加密,下面介绍。
SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法。
SM2、SM9是非对称算法。
SM3是哈希算法。
目前使用这些算法公开可用的,并且已经得到了广泛的应用和支持。