Node.js 中的 crypto 模块解析

· 约 10 分钟读完

在前端开发中,加密和解密是一个重要的部分。在 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 哈希示例:

在上面的示例中,我们定义了一个明文字符串 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 必须与加密时使用的相同。
  • 在使用非对称加密算法时,应将私钥保存在安全的地方,以免泄露。
  • 在使用哈希算法时,哈希值不可逆,应谨慎使用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d1d9f5a941bf71343c9c5c