在前端开发中,加密和解密是一个重要的部分。在 Node.js 中,crypto 模块提供了一系列的加密和解密方法,包括对称加密、非对称加密以及哈希算法等。本文将详细介绍 Node.js 中的 crypto 模块,包括其常用方法、使用示例以及注意事项。
常用方法
对称加密
对称加密是指加密和解密使用同一个密钥的加密方式。Node.js 中的 crypto 模块提供了多种对称加密算法,包括 AES、DES、3DES 等。其中,AES 是最常用的对称加密算法之一。
AES 加密
AES 加密使用的是一个密钥和一个初始化向量(IV),其中密钥是用于加密和解密的秘密密钥,而 IV 则是用于加密过程中的初始值。下面是一个简单的 AES 加密示例:
-- -------------------- ---- ------- ----- ------ - ------------------ ----- --- - ----------------------- ----- -- - ----------------------- ----- ------ - ------------------------------------ ---- ---- --- --------- - --------------------- -------- ------- ------- --------- -- -------------------- ------------------------- -----------
在上面的示例中,我们首先生成了一个 32 字节的密钥和一个 16 字节的 IV,然后使用 crypto.createCipheriv() 方法创建了一个 AES 加密器,指定了加密算法为 aes-256-cbc,使用了生成的密钥和 IV,最后使用 cipher.update() 方法对明文进行加密,并使用 cipher.final() 方法输出加密后的密文。
AES 解密
AES 解密使用的密钥和 IV 必须与加密时使用的相同。下面是一个简单的 AES 解密示例:
-- -------------------- ---- ------- ----- ------ - ------------------ ----- --- - ----------------------- ----- -- - ----------------------- ----- ------ - ------------------------------------ ---- ---- --- --------- - --------------------- -------- ------- ------- --------- -- -------------------- ----- -------- - -------------------------------------- ---- ---- --- --------- - -------------------------- ------ -------- --------- -- ----------------------- ------------------------- -----------
在上面的示例中,我们首先生成了一个 32 字节的密钥和一个 16 字节的 IV,然后使用 crypto.createCipheriv() 方法创建了一个 AES 加密器,指定了加密算法为 aes-256-cbc,使用了生成的密钥和 IV,最后使用 cipher.update() 方法对明文进行加密,并使用 cipher.final() 方法输出加密后的密文。接着,我们使用 crypto.createDecipheriv() 方法创建了一个 AES 解密器,使用了相同的密钥和 IV,最后使用 decipher.update() 方法对密文进行解密,并使用 decipher.final() 方法输出解密后的明文。
非对称加密
非对称加密是指加密和解密使用不同密钥的加密方式。Node.js 中的 crypto 模块提供了多种非对称加密算法,包括 RSA、DSA 等。其中,RSA 是最常用的非对称加密算法之一。
RSA 加密
RSA 加密使用的是一对公私钥,其中公钥用于加密,私钥用于解密。下面是一个简单的 RSA 加密示例:
-- -------------------- ---- ------- ----- ------ - ------------------ ----- - ---------- ---------- - - --------------------------------- - -------------- ----- --- ----- ------- - ------- -------- ----- --------- - ------------------------------- -------------------- ---------------------------- ------------------------- -----------
在上面的示例中,我们首先使用 crypto.generateKeyPairSync() 方法生成了一对公私钥,指定了加密算法为 RSA,密钥长度为 2048 位。接着,我们定义了一个明文字符串 message,使用 crypto.publicEncrypt() 方法对其进行加密,并将结果转换为 Base64 编码的字符串输出。
RSA 解密
RSA 解密使用的是一对公私钥,其中公钥用于加密,私钥用于解密。下面是一个简单的 RSA 解密示例:
-- -------------------- ---- ------- ----- ------ - ------------------ ----- - ---------- ---------- - - --------------------------------- - -------------- ----- --- ----- ------- - ------- -------- ----- --------- - ------------------------------- -------------------- ---------------------------- ----- --------- - --------------------------------- ---------------------- ---------------------------- ------------------------- -----------
在上面的示例中,我们首先使用 crypto.generateKeyPairSync() 方法生成了一对公私钥,指定了加密算法为 RSA,密钥长度为 2048 位。接着,我们定义了一个明文字符串 message,使用 crypto.publicEncrypt() 方法对其进行加密,并将结果转换为 Base64 编码的字符串。最后,我们使用 crypto.privateDecrypt() 方法对密文进行解密,并将结果转换为 UTF-8 编码的字符串输出。
哈希算法
哈希算法是指将任意长度的输入(也称为消息)压缩成固定长度的输出(也称为哈希值)的算法。Node.js 中的 crypto 模块提供了多种哈希算法,包括 SHA-1、SHA-256、SHA-512 等。
SHA-256 哈希
SHA-256 是一种常用的哈希算法,其输出长度为 256 位。下面是一个简单的 SHA-256 哈希示例:
const crypto = require('crypto');
const message = 'Hello, world!';
const hash = crypto.createHash('sha256').update(message).digest('hex');
console.log('Hash:', hash);在上面的示例中,我们定义了一个明文字符串 message,使用 crypto.createHash() 方法创建了一个 SHA-256 哈希器,并使用 hash.update() 方法将明文字符串输入哈希器,最后使用 hash.digest() 方法输出哈希值,以十六进制字符串的形式表示。
使用示例
加密和解密
下面是一个使用 AES 对称加密算法进行加密和解密的示例:
-- -------------------- ---- ------- ----- ------ - ------------------ ----- --- - ----------------------------------- ----- -- - ------------------- -------- ------------------ - ----- ------ - ------------------------------------ ---- ---- --- --------- - ------------------------ ------- ------- --------- -- -------------------- ------ ---------- - -------- ------------------- - ----- -------- - -------------------------------------- ---- ---- --- --------- - --------------------------- ------ -------- --------- -- ----------------------- ------ ---------- - ----- --------- - ------- -------- ----- ---------- - ------------------- ----- --------- - -------------------- ------------------------- ----------- -------------------------- ------------ ------------------------- -----------
在上面的示例中,我们首先定义了一个 16 字节的密钥和一个 16 字节的 IV。接着,我们定义了两个函数 encrypt() 和 decrypt(),分别用于对明文进行加密和对密文进行解密。其中,crypto.createCipheriv() 方法用于创建一个 AES 加密器,指定了加密算法为 aes-128-cbc,使用了定义的密钥和 IV;crypto.createDecipheriv() 方法用于创建一个 AES 解密器,使用了相同的密钥和 IV。最后,我们定义了一个明文字符串 plaintext,使用 encrypt() 函数对其进行加密,并将结果输出;接着,我们使用 decrypt() 函数对密文进行解密,并将结果输出。
哈希
下面是一个使用 SHA-256 哈希算法对字符串进行哈希的示例:
-- -------------------- ---- ------- ----- ------ - ------------------ -------- ------------- - ------ ---------------------------------------------------------- - ----- ------- - ------- -------- ----- ------ - -------------- ----------------------- --------- ---------------------- --------
在上面的示例中,我们定义了一个 hash() 函数,用于对输入字符串进行 SHA-256 哈希,并将结果输出。其中,crypto.createHash() 方法用于创建一个 SHA-256 哈希器,使用了 hash.update() 方法将输入字符串输入哈希器,最后使用 hash.digest() 方法输出哈希值,以十六进制字符串的形式表示。最后,我们定义了一个明文字符串 message,使用 hash() 函数对其进行哈希,并将结果输出。
注意事项
在使用 crypto 模块进行加密和解密时,需要注意以下事项:
- 密钥和 IV 的生成应使用随机数生成器,以增加安全性。
- 在使用对称加密算法时,密钥和 IV 必须与加密时使用的相同。
- 在使用非对称加密算法时,应将私钥保存在安全的地方,以免泄露。
- 在使用哈希算法时,哈希值不可逆,应谨慎使用。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d1d9f5a941bf71343c9c5c