▒ 目录 ▒
- 🛫 导读
- 需求
- 开发环境
- 1️⃣ hash
- 对象创建Hash
- 常见方法
- 例封装成 stream 实例
- 封装成管道流(piped stream)
- 2️⃣ hmac
- 对象创建Hmac
- 常见方法
- 例封装成 stream 实例
- 封装成管道流(piped stream)
- 🛬 文章小结
- 📖 参考资料
🛫 导读
需求
说到安全,就不得不说,加密与解密,今天要说的是nodejs原生加密库
crypto
(不是crypto-js
)。
crypto 模块需要node 所运行的运行支持
OpenSSL
,该模块为使用安全证书实现HTTPS 安全网络以及HTTP 连接提供了支持。 模块同样为OpenSSL 的hash
、hmac
、cipher、decipher、sign 以及verify 方法提供一层包装(以方便在Node 中 使用)。
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2022-12-12 | |
1️⃣ hash
对象创建Hash
crypto.createHash(algorithm)
该方法用于创建和返回一个 Hash 对象,该对象可以使用指定algorithm
生成哈希摘要。
algorithm
参数的值受限于当前平台 OpenSLL 所支持的算法,比如sha256
、sha512
等。在最新的 OpneSSL 版本中,使用openssl list-cipher-algorithms
命令可以显示所有可用的摘要算法。
常见方法
hash.update(data[, input_encoding])
该方法根据 data 参数更新哈希后的数据,可选参数input_encoding
指定的编码格式必须为utf8、ascii 或 binary
之一。
如果没有指定 encoding 参数,且 data 为字符串数据,则强制使用binary
编码格式。如果 data 是一个 Buffer 实例,则会自动忽略 input_encoding 参数的值。
当数据被包装成 stream 实例之后,该方法可以调用多次。
hash.digest([encoding])
该方法用于计算原始数据的哈希摘要。encoding 参数的值必须为hex
、binary
或base64
其中的一个。如果指定了有效的 encoding 参数,则该方法返回一个字符串,否则返回一个 Buffer 实例。
在 hash.digest() 方法执行之后,不能再重复调用 Hash 对象
,多次调用该方法将会抛出错误。
例封装成 stream 实例
可以比对在线网站查看hash值进行结果确认:
6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
。
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.on('readable', () => {
var data = hash.read();
if (data)
console.log(data.toString('hex'));
// Prints:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
});
hash.write('some data to hash');
hash.end();
封装成管道流(piped stream)
const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');
const input = fs.createReadStream('test.js');
input.pipe(hash).pipe(process.stdout);
2️⃣ hmac
对象创建Hmac
crypto.createHmac(algorithm, key)
该方法根据传入的 algorithm 和 key 创建和返回一个 Hmac 对象。
algorithm
参数的值受限于当前平台 OpenSLL 所支持的算法,比如sha256
、sha512
等。在最新的 OpneSSL 版本中,使用openssl list-cipher-algorithms
命令可以显示所有可用的摘要算法。
这里的参数 key 是 HMAC 用于生成加密 HMAC 哈希的密钥。
常见方法
跟Hash一样的。
例封装成 stream 实例
可以比对在线网站查看hash值进行结果确认:
7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
。
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');
hmac.on('readable', () => {
var data = hmac.read();
if (data)
console.log(data.toString('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
});
hmac.write('some data to hash');
hmac.end();
封装成管道流(piped stream)
const crypto = require('crypto');
const fs = require('fs');
const hmac = crypto.createHmac('sha256', 'a secret');
const input = fs.createReadStream('test.js');
input.pipe(hmac).pipe(process.stdout);
🛬 文章小结
hash和hmac都属于散列算法,hmac可以理解为
带密码的hash
。
使用场景:
- 文件对比:验证两个文件是否一致,通过MD5算法计算MD5值,看两个文件是否一致,如果一致证明同一个文件(高效、唯一特性)。
- 登录口令:注册、登录功能,不会直接将用户密码明文入库,一般采用hash(口令+salt)算出摘要值入库,登录的时候也通过hash方式去匹配。
MAC (Message Authentication Code)
MD5(MD5 Message-Digest Algorithm)
SHA1(Secure Hash Algorithm 1)
SHA2(Secure Hash Algorithm 2)
SHA3(Secure Hash Algorithm 3)
📖 参考资料
- 官网文档-英文的:https://nodejs.org/docs/latest-v13.x/api/crypto.html
- Node.js 5.x 中文文档 https://www.bookstack.cn/read/node-doc-5.x/doc-crypto.md
- Node.js技术栈 https://www.bookstack.cn/read/Nodejs-Roadmap/nodejs-crypto.md
- 在线hash https://www.sojson.com/hash.html
- 加密算法简单了解——HASH、MAC及一些加密模式 https://blog.csdn.net/weixin_42040046/article/details/118084576
**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。