Bun 实现了
node:crypto 中的 createHash 和 createHmac 函数,
以及下面记录的 Bun 原生 API。Bun.password
Bun.password 是一组使用多种密码学安全算法进行密码哈希和验证的实用函数集合。
Bun.password.hash 的第二个参数是一个配置对象,可用于选择和配置哈希算法。
bcrypt 时,返回的哈希以 模块化密码格式 (Modular Crypt Format) 编码,以保证与大多数现有的 bcrypt 实现兼容;使用 argon2 时,结果采用较新的 PHC 格式 编码。
verify 函数能基于输入的哈希自动检测算法并使用正确的验证方法,可正确解析 PHC 或 MCF 编码的哈希算法。
盐值
使用Bun.password.hash 时,会自动生成盐值并包含在哈希中。
bcrypt — 模块化密码格式
在下面的 模块化密码格式 哈希示例(bcrypt 使用): 输入:bcrypt标识符:$2b- 轮数:
$10- 轮数的对数(log10) - 盐值:
$Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFi - 哈希值:
$GzJ8PuBi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4
Bun.password.hash 的密码超过 72 字节并选择使用 bcrypt 算法,则密码会先通过 SHA-512 计算哈希,再传给 bcrypt。
argon2 — PHC 格式
以下为采用 PHC 格式 的哈希 (argon2 使用): 输入:- 算法:
$argon2id - 版本:
$v=19 - 内存成本:
65536 - 迭代次数:
t=2 - 并行度:
p=1 - 盐值:
$xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOs - 哈希值:
$2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI
Bun.hash
Bun.hash 是一组用于非密码学哈希的实用工具。非密码学哈希算法优化的是计算速度而非抗碰撞性或安全性。
标准的 Bun.hash 函数使用 Wyhash 算法,根据任意长度输入生成64位哈希。
TypedArray、DataView、ArrayBuffer 或 SharedArrayBuffer。
Number.MAX_SAFE_INTEGER,需用 BigInt 传入避免精度损失。
Bun.hash 的属性提供。API 一致,只是返回值类型从 32 位的 number 改为 64 位的 bigint。
Bun.CryptoHasher
Bun.CryptoHasher 是一个通用的工具类,支持增量计算字符串或二进制数据的哈希,支持多种密码学哈希算法。支持的算法包括:
"blake2b256""blake2b512""md4""md5""ripemd160""sha1""sha224""sha256""sha384""sha512""sha512-224""sha512-256""sha3-224""sha3-256""sha3-384""sha3-512""shake128""shake256"
.update() 方法增量输入数据,参数可为 string、TypedArray 或 ArrayBuffer。
string,可选第2个参数指定编码(默认为 'utf-8')。支持的编码如下:
| 编码类别 | 支持的编码 |
|---|---|
| 二进制编码 | "base64" "base64url" "hex" "binary" |
| 字符编码 | "utf8" "utf-8" "utf16le" "latin1" |
| 旧版字符编码 | "ascii" "binary" "ucs2" "ucs-2" |
.digest() 计算最终哈希。默认情况下,返回的是包含哈希值的 Uint8Array。
.digest() 方法也可以返回字符串格式哈希,方法是指定编码:
TypedArray 实例,适合某些对性能敏感的场景。
Bun.CryptoHasher 中的 HMAC
Bun.CryptoHasher 也支持计算 HMAC。需要在构造函数传入密钥。
"blake2b512""md5""sha1""sha224""sha256""sha384""sha512-224""sha512-256""sha512"
.digest() 调用后不会重置实例,再次使用同一实例会抛出错误。
支持 .copy() 和 .update()(在 .digest() 前),但 .digest() 方法不允许多次调用。