Skip to main content
Bun 实现了 node:crypto 中的 createHash 和 createHmac 函数, 以及下面记录的 Bun 原生 API。

Bun.password

Bun.password 是一组使用多种密码学安全算法进行密码哈希和验证的实用函数集合。
Bun.password.hash 的第二个参数是一个用于选择和配置哈希算法的参数对象。
用于创建哈希的算法会存储在哈希本身中。使用 bcrypt 时,Bun 会以 模块化密码格式 对返回的哈希进行编码,以兼容大多数现有的 bcrypt 实现。使用 argon2 时,Bun 会以较新的 PHC 格式 对结果进行编码。 verify 函数会从输入哈希中检测算法,无论其采用 PHC 格式还是 MCF 格式编码,并使用匹配的验证方法。
所有函数也都提供同步版本。这些函数的计算成本较高,因此阻塞式 API 可能会降低应用程序性能。

盐值

Bun.password.hash 会自动生成盐值,并将其包含在哈希中。

bcrypt — 模块化密码格式

在下面的 模块化密码格式 哈希示例中使用了 bcrypt: 输入:
输出:
格式由以下部分组成:
  • bcrypt:$2b
  • rounds:$10 - 轮数(实际轮数的以 2 为底的对数)
  • salt:Lyj9kHYZtiyfxh2G60TEfe
  • hash:qs7xkkGi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4
默认情况下,bcrypt 库会截断长度超过 72 字节的密码。Bun.password.hash 使用 bcrypt 算法时,不会静默截断密码,而是会先使用 SHA-512 对任何长度超过 72 字节的密码进行哈希,然后再将其传递给 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。
第二个参数是可选的整数种子。对于 64 位哈希值,如果种子超过 Number.MAX_SAFE_INTEGER,请将其作为 BigInt 传递,以避免精度损失。
其他哈希算法可作为 Bun.hash 的属性使用。每种算法的 API 都相同;32 位哈希值返回 number,64 位哈希值返回 bigint。

Bun.CryptoHasher

Bun.CryptoHasher 使用密码学哈希算法对字符串或二进制数据进行增量哈希计算。它支持以下算法:
  • "blake2b256"
  • "blake2b512"
  • "blake2s256"
  • "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。
对于字符串,可选的第二个参数用于指定编码(默认为 'utf-8')。支持以下编码:
传入所有数据后,使用 .digest() 计算最终哈希值。默认情况下,此方法会返回一个包含哈希值的 Uint8Array。
要将哈希值作为字符串获取,请向 .digest() 传入编码:
此外,.digest() 还可以将哈希值写入现有的 TypedArray,而不是分配一个新的数组。

Bun.CryptoHasher 中的 HMAC

Bun.CryptoHasher 可以计算 HMAC 摘要。将密钥传入构造函数。
HMAC 支持的算法集合更加有限:
  • "blake2b256"
  • "blake2b512"
  • "md4"
  • "md5"
  • "ripemd160"
  • "sha1"
  • "sha224"
  • "sha256"
  • "sha384"
  • "sha512"
  • "sha512-224"
  • "sha512-256"
  • "sha3-224"
  • "sha3-256"
  • "sha3-384"
  • "sha3-512"
与非 HMAC 的 Bun.CryptoHasher 不同,HMAC Bun.CryptoHasher 实例在调用 .digest() 后不会重置。再次使用同一实例会抛出错误。 只要在调用 .digest() 之前执行,.copy() 和 .update() 等其他方法也都受支持。