除了下面记录的 Bun 原生 API 外,Bun 还实现了来自
node:crypto 的 createHash 和 createHmac 函数。Bun.password
Bun.password 是一组用于使用各种密码学安全算法进行哈希和验证密码的实用函数集合。
Bun.password.hash 的第二个参数接受一个参数对象,让您选择和配置哈希算法。
bcrypt 时,返回的哈希值采用 Modular Crypt Format 编码,以兼容大多数现有的 bcrypt 实现;使用 argon2 时,结果采用较新的 PHC 格式 编码。
verify 函数会根据输入哈希值自动检测算法并使用正确的验证方法。它可以从 PHC 或 MCF 编码的哈希值正确推断算法。
Salt
当您使用Bun.password.hash 时,会自动生成 salt 并包含在哈希中。
bcrypt - Modular Crypt Format
在以下 Modular Crypt Format 哈希(由bcrypt 使用)中:
输入:
bcrypt:$2brounds:$10- 轮数(实际轮数的 log10)salt:$Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFihash:$GzJ8PuBi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4
Bun.password.hash 的密码长度超过 72 字节并使用 bcrypt 算法,密码将在传递给 bcrypt 之前通过 SHA-512 进行哈希。
argon2 - PHC format
在以下 PHC format 哈希(由argon2 使用)中:
输入:
algorithm:$argon2idversion:$v=19memory cost:65536iterations:t=2parallelism:p=1salt:$xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOshash:$2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI
Bun.hash
Bun.hash 是一组用于_非加密_哈希的实用工具。非加密哈希算法针对计算速度进行了优化,而不是冲突抵抗或安全性。
标准的 Bun.hash 函数使用 Wyhash 从任意大小的输入生成 64 位哈希。
TypedArray、DataView、ArrayBuffer 或 SharedArrayBuffer。
Number.MAX_SAFE_INTEGER 的种子应作为 BigInt 提供,以避免精度损失。
Bun.hash 上的属性还提供了其他哈希算法。每个算法的 API 都相同,只是 32 位哈希返回数字,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,可选的第二个参数可用于指定编码(默认为 '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"
Bun.CryptoHasher 不同,HMAC Bun.CryptoHasher 实例在调用 .digest() 后不会重置,尝试再次使用同一实例将引发错误。
其他方法如 .copy() 和 .update() 是受支持的(只要在 .digest() 之前),但像 .digest() 这样终结哈希器的方法则不受支持。