加密在现代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));

安全建议

  1. 对于密码存储,建议使用bcrypt或PBKDF2等专门设计的算法
  2. MD5和SHA1不应再用于安全敏感场景
  3. 使用足够长的密钥(AES至少128位,RSA至少2048位)
  4. 定期更换加密密钥

单词、短语表

单词(短语) 音标 词性 词根/词缀 释义 搭配 例子
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中实现常见加密算法的方法。根据您的安全需求选择合适的算法,并始终遵循最佳安全实践。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐