JavaScript 常用加密算法实现
·
加密在现代Web开发中扮演着重要角色,本文将介绍JavaScript中常用的加密算法实现,包括MD5、SHA1、Base64、AES(替代DES)和RSA等。
一、MD5加密
MD5是一种广泛使用的哈希算法,生成128位的哈希值。虽然MD5已被证明存在安全漏洞,但仍被用于一些非安全关键场景。
const crypto = require('crypto');
function md5(text) {
return crypto.createHash('md5').update(text).digest('hex');
}
// 使用示例
console.log(md5('Kiba518')); // 输出32位MD5哈希值
二、SHA1加密
SHA1比MD5更安全,生成160位的哈希值,但同样已被发现存在安全弱点。
function sha1(text) {
return crypto.createHash('sha1').update(text).digest('hex');
}
// 使用示例
console.log(sha1('Kiba518'));
三、Base64编码/解码
Base64是一种编码方式,常用于在HTTP环境下传输二进制数据。
// 编码
function base64Encode(text) {
return Buffer.from(text).toString('base64');
}
// 解码
function base64Decode(encodedText) {
return Buffer.from(encodedText, 'base64').toString('utf8');
}
// 使用示例
const encoded = base64Encode('Kiba518');
console.log(encoded);
console.log(base64Decode(encoded));
四、AES加密/解密(替代DES)
AES是DES的替代方案,更安全且支持多种密钥长度(128, 192, 256位)。
function aesEncrypt(text, key) {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
function aesDecrypt(text, key) {
const parts = text.split(':');
const iv = Buffer.from(parts.shift(), 'hex');
const encryptedText = Buffer.from(parts.join(':'), 'hex');
const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
// 使用示例
const key = 'abcdefghabcdefghabcdefghabcdefgh'; // 32字节密钥
const encrypted = aesEncrypt('Kiba518', key);
console.log(encrypted);
console.log(aesDecrypt(encrypted, key));
五、RSA加密/解密
RSA是一种非对称加密算法,使用公钥加密、私钥解密。
// 生成密钥对
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: { type: 'spki', format: 'pem' },
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});
// RSA加密
function rsaEncrypt(text, publicKey) {
return crypto.publicEncrypt(publicKey, Buffer.from(text)).toString('base64');
}
// RSA解密
function rsaDecrypt(encrypted, privateKey) {
return crypto.privateDecrypt(privateKey, Buffer.from(encrypted, 'base64')).toString();
}
// 使用示例
const encrypted = rsaEncrypt('Kiba518', publicKey);
console.log(encrypted);
console.log(rsaDecrypt(encrypted, privateKey));
六、处理长文本的RSA加密
RSA对加密文本长度有限制,需要分段处理:
function rsaEncryptLong(text, publicKey, chunkSize = 200) {
const buffer = Buffer.from(text);
const encryptedChunks = [];
for (let i = 0; i < buffer.length; i += chunkSize) {
const chunk = buffer.slice(i, i + chunkSize);
encryptedChunks.push(crypto.publicEncrypt(publicKey, chunk));
}
return Buffer.concat(encryptedChunks).toString('base64');
}
function rsaDecryptLong(encrypted, privateKey, chunkSize = 256) {
const buffer = Buffer.from(encrypted, 'base64');
const decryptedChunks = [];
for (let i = 0; i < buffer.length; i += chunkSize) {
const chunk = buffer.slice(i, i + chunkSize);
decryptedChunks.push(crypto.privateDecrypt(privateKey, chunk));
}
return Buffer.concat(decryptedChunks).toString();
}
// 使用示例
const longText = '这是一段很长的文本...'.repeat(50);
const longEncrypted = rsaEncryptLong(longText, publicKey);
console.log(rsaDecryptLong(longEncrypted, privateKey));
安全建议
- 对于密码存储,建议使用bcrypt或PBKDF2等专门设计的算法
- MD5和SHA1不应再用于安全敏感场景
- 使用足够长的密钥(AES至少128位,RSA至少2048位)
- 定期更换加密密钥
单词、短语表
| 单词(短语) | 音标 | 词性 | 词根/词缀 | 释义 | 搭配 | 例子 |
|---|---|---|---|---|---|---|
| encryption | /ɪnˈkrɪpʃən/ | n. | en- (使)+ crypt (隐藏) | 加密 | data encryption, encryption algorithm | The system uses strong encryption to protect user data. |
| decryption | /diːˈkrɪpʃən/ | n. | de- (去除)+ crypt (隐藏) | 解密 | decryption key, decryption process | The decryption of the message required a private key. |
| hash | /hæʃ/ | n./v. | - | 哈希/散列 | hash function, hash value | MD5 is a commonly used hash function. |
| symmetric | /sɪˈmetrɪk/ | adj. | sym- (共同)+ metr (测量) | 对称的 | symmetric encryption, symmetric key | AES is a symmetric encryption algorithm. |
| asymmetric | /ˌeɪsɪˈmetrɪk/ | adj. | a- (不)+ symmetric | 非对称的 | asymmetric cryptography | RSA is an asymmetric encryption algorithm. |
| cipher | /ˈsaɪfər/ | n. | - | 密码 | cipher text, cipher algorithm | The message was transformed into cipher text. |
| plaintext | /ˈpleɪntekst/ | n. | plain (普通)+ text | 明文 | plaintext message | Never store passwords as plaintext. |
| key pair | /kiː pɛər/ | n. | - | 密钥对 | generate key pair | RSA uses a public/private key pair. |
| digest | /ˈdaɪdʒest/ | n./v. | di- (分开)+ gest (携带) | 摘要/消化 | message digest | A hash function produces a fixed-size digest. |
| padding | /ˈpædɪŋ/ | n. | - | 填充 | padding scheme | OAEP is a padding scheme used in RSA. |
通过本文,您应该已经掌握了JavaScript中实现常见加密算法的方法。根据您的安全需求选择合适的算法,并始终遵循最佳安全实践。
更多推荐
所有评论(0)