bitanon/hashlib

GitHub: bitanon/hashlib

一个纯 Dart 编写的综合性密码学哈希库,提供安全哈希、校验和、密钥派生、MAC、OTP 生成和安全随机数等算法,支持 Dart 全平台运行。

Stars: 33 | Forks: 2

# hashlib [![package version](https://img.shields.io/pub/v/hashlib?label=pub.dev)](https://pub.dev/packages/hashlib) [![dart support](https://img.shields.io/badge/dart-%3E%3D%202.19.0-0175C2?logo=dart&logoColor=white)](https://dart.dev/guides/whats-new) [![likes](https://img.shields.io/pub/likes/hashlib?logo=dart)](https://pub.dev/packages/hashlib/score) [![pub points](https://img.shields.io/pub/points/hashlib?logo=dart&color=teal)](https://pub.dev/packages/hashlib/score) [![monthly downloads](https://img.shields.io/pub/dm/hashlib?logo=dart)](https://pub.dev/packages/hashlib/score) [![codecov](https://codecov.io/gh/bitanon/hashlib/branch/master/graph/badge.svg?token=PYVMZWSQNU)](https://codecov.io/gh/bitanon/hashlib) [![Test](https://static.pigsec.cn/wp-content/uploads/repos/cas/ce/ce733292a922c08274cf5a2096f8fa4cf01023bfa51a36ef6beecaaef371a9d9.svg)](https://github.com/bitanon/hashlib/actions/workflows/test.yml) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/bitanon/hashlib) 一个纯 Dart 编写的安全哈希函数、校验和、MAC、密钥派生函数、OTP 生成器和安全随机数的库——这是一个广泛、快速且依赖轻量级的工具箱,可以在 Dart 运行的任何地方运行。 `hashlib` 是一个由三个包组成的家族中的中间层: [![convertlib](https://img.shields.io/badge/convertlib-informational?style=for-the-badge&logo=dart)](https://pub.dev/packages/convertlib) → [![hashlib](https://img.shields.io/badge/hashlib-success?style=for-the-badge&logo=dart)](https://pub.dev/packages/hashlib) → [![cipherlib](https://img.shields.io/badge/cipherlib-blue?style=for-the-badge&logo=dart)](https://pub.dev/packages/cipherlib) 它基于 `convertlib` 进行十六进制、Base32/Base64 和 UTF-8 转换,这也是它唯一的运行时依赖。 ## 核心亮点 - **支持所有平台**:纯 Dart 实现,无需原生代码或 FFI,因此同一套库可以在 Dart 运行的任何地方工作——包括 VM、Flutter(Android、iOS、Windows、macOS、Linux)以及 Web(dart2js 和 dart2wasm)。 - **功能齐全**:包含十多个哈希家族(MD、SHA-1、SHA-2、SHA-3、SHAKE、Keccak、BLAKE2、RIPEMD、SM3、xxHash)、校验和(CRC、Adler-32)、MAC(HMAC、Poly1305)、密码 KDF(Argon2、scrypt、bcrypt、PBKDF2)、TOTP/HOTP 以及 RNG/UUID 生成器。 - **单次或流式处理**:可以在单次调用中对 `String` 或字节缓冲区进行哈希处理,或者对于大文件或分块输入,通过可重用的 sink 增量式地喂入数据。 - **密码级别的 KDF**:支持 Argon2id、scrypt、bcrypt 和 PBKDF2,通过具名的 `security` 预设使成本/延迟权衡更加明确。 - **极速**:在性能上持续超越 `crypto`、`PointyCastle` 和 `hash`,详情请参阅下方的[基准测试](#benchmarks)。 - **内置编解码器和安全随机数**:随包附带了配套的 `codecs` 和 `random` 库。 ## 安装 ``` dependencies: hashlib: ^2.4.1 ``` 或者运行 `dart pub add hashlib`。只需一个 import 即可暴露所有的算法: ``` import 'package:hashlib/hashlib.dart'; ``` 两个配套库与其完美搭配——`codecs` 用于十六进制/Base/UTF-8 转换(从 `convertlib` 重新导出),`random` 用于生成安全的随机字节、数字和 UUID: ``` import 'package:hashlib/codecs.dart'; // toHex, fromHex, toBase64, toUtf8 import 'package:hashlib/random.dart'; // randomBytes, uuid, HashlibRandom ``` 完整的 API 参考:[hashlib 库](https://pub.dev/documentation/hashlib/latest/)。 ## 快速入门 通过单次调用计算字符串的摘要,并通过附加密钥从任意哈希派生出 HMAC: ``` import 'package:hashlib/hashlib.dart'; void main() { final text = 'Happy Hashing!'; // One-shot hex digest print(sha256.string(text)); // Keyed HMAC-SHA256 print(sha256.hmac.byString('password').string(text)); } ``` ## 支持的算法 ### 块哈希算法 | 算法 | 可用方法 | 来源 | | ----------- | ------------------------------------------------------------------- | :--------------------: | | MD2 | `md2`, `md2sum` | [RFC-1319] | | MD4 | `md4`, `md4sum` | [RFC-1320] | | MD5 | `md5`, `md5sum` | [RFC-1321] | | SHA-1 | `sha1`, `sha1sum` | [RFC-3174] | | SHA-2 | `sha224`, `sha256`, `sha384`, `sha512`, `sha512t224`, `sha512t256` | [RFC-6234] | | SHA-3 | `sha3_224`, `sha3_256`, `sha3_384`, `sha3_512` | [FIPS-202] | | SHAKE-128 | `Shake128`, `shake128`, `shake128_128`, `shake128_256` | [FIPS-202] | | SHAKE-256 | `Shake256`, `shake256`, `shake256_256`, `shake256_512` | [FIPS-202] | | Keccak | `keccak224`, `keccak256`, `keccak384`, `keccak512` | [Team Keccak] | | Blake2b | `blake2b160`, `blake2b256`, `blake2b384`, `blake2b512` | [RFC-7693] | | Blake2s | `blake2s128`, `blake2s160`, `blake2s224`, `blake2s256` | [RFC-7693] | | xxHash-32 | `XXHash32`, `xxh32`, `xxh32code` | [Cyan4973] | | xxHash-64 | `XXHash64`, `xxh64`, `xxh64code` | [Cyan4973] | | xxHash3-64 | `XXH3`, `xxh3`, `xxh3code` | [Cyan4973] | | xxHash3-128 | `XXH128`, `xxh128`, `xxh128code` | [Cyan4973] | | RIPEMD | `ripemd128`, `ripemd256`, `ripemd160`, `ripemd320` | [ISO/IEC 10118-3:2018] | | SM3 | `sm3`, `sm3sum` | [GB/T 32905-2016] | ### 密码 / 密钥派生算法 | 算法 | 可用方法 | 来源 | | ------- | ----------------------------------------------------------------- | ---------- | | Argon2 | `Argon2`, `argon2d`, `argon2i`, `argon2id`, `argon2Verify` | [RFC-9106] | | PBKDF2 | `PBKDF2`, `pbkdf2`, `#.pbkdf2` | [RFC-8081] | | scrypt | `Scrypt`, `scrypt` | [RFC-7914] | | bcrypt | `Bcrypt`, `bcrypt`, `bcryptSalt`, `bcryptVerify`, `bcryptDigest` | | ### 消息认证码(MAC) | 算法 | 可用方法 | 来源 | | -------- | --------------------------- | ---------- | | HMAC | `HMAC`, `#.hmac` | [RFC-2104] | | Poly1305 | `Poly1305`, `poly1305`, `poly1305auth` | [RFC-8439] | ### 一次性密码(2FA) | 算法 | 可用方法 | 来源 | | ---- | -------- | ---------- | | HOTP | `HOTP` | [RFC-4226] | | TOTP | `TOTP` | [RFC-6238] | ### 校验和 | 算法 | 可用方法 | 来源 | | -------- | -------------------------- | ------------------ | | CRC | `crc16`, `crc32`, `crc64` | [维基百科][crc] | | Adler-32 | `adler32` | [维基百科][adler] | ### 随机数与 UUID `random` 库通过 `HashlibRandom`(`secure`, `system`, `keccak`, `sha256`, `md5`, `xxh64`, `sm3`)提供随机数生成器,以及像 `randomBytes`、`randomNumbers` 和 `randomString` 这样的辅助工具。UUID 的 v1、v3、v4、v5、v6、v7 和 v8 版本可以通过 `uuid` 获取。 ## 安全说明 - **使用 KDF 而不是裸哈希来处理密码。** 存储带有适当 `security` 预设的 `argon2id`(或 `scrypt` / `bcrypt`)输出——绝不是密码的普通 `sha256`——并使用 `argon2Verify` / `bcryptVerify` 进行检查。 - **在恒定时间内比较摘要。** 在验证 MAC 和摘要时,使用 `HashDigest.isEqual` 代替 `==` 或手动字节循环,以避免通过时间差泄露信息。 - **旧算法仅供兼容使用。** MD2、MD4、MD5 和 SHA-1 已在密码学上被破解;仅将它们用于互操作性或非安全性校验和,对于新项目,请优先选择 SHA-256、SHA-3 或 BLAKE2。 - **非密码学哈希。** CRC、Adler-32 和 xxHash 系列是用于快速完整性和查找的哈希,面对对手时并不安全——不要在需要抗冲突或抗原像的场景中使用它们。 - **运行时计时。** 纯 Dart 执行(JIT、AOT、dart2js)不保证在恒定时间内运行;在依赖它处理侧信道敏感的环境之前,请仔细权衡部署环境。 ## 测试与可靠性 正确性是本库的首要目标,测试套件正是为了执行这一目标而构建的。这里有 **分布在 60 多个文件中的 700 个测试用例**,在每次更改后和每次发布前,都会在 **三个平台上运行:Dart VM、Node.js 和 Chrome (WASM)**。 每个算法都通过几种独立的方式进行验证: - **官方已知答案测试向量。** 摘要会根据相关标准——RFC、FIPS/NIST 出版物以及每种算法的参考实现——发布的测试向量进行固定比对。预期值绝不是凭空捏造的;每个向量都在测试文件中注明了其来源。 - **差异化交叉验证。** 对于其他成熟的、独立的 Dart 包也实现了的每种算法,其输出都会与 [`crypto`][crypto] 和 [`pointycastle`][pointycastle] 在数百个随机输入上进行逐字节比对。目前这涵盖了 MD2、MD4、MD5、SHA-1、SHA-224/256/384/512、SHA-512/224、SHA-512/256、SHA3(224–512)、Keccak(224–512)、RIPEMD-128/160/256/320、BLAKE2b、SM3 和 HMAC。填充、字节序或块边界上的细微差异都可能导致这些测试失败,即使它逃脱了固定向量的检查。 - **边界与边缘覆盖。** 输入会在空字符串、单字节以及跨越每个算法内部块/速率大小的长度(例如 `block−1`、`block`、`block+1` 和多块消息)上进行测试——这正是隐藏长度编码和填充错误的地方。 - **流式等同于单次处理。** 分块/流式输入和增量 `Sink` API(包括 `reset()`、双重 `close()` 和关闭后使用)经验证会产生与单次处理路径完全相同的摘要。 - **参数验证。** 断言无效的密钥、盐值、摘要和参数长度会抛出类型化错误,而不是默默产生弱输出。 这些算法计算出的正是其标准所定义的结果, 并已通过官方向量和多个独立实现进行了验证。 仍然请您阅读上方的[安全说明](#security-notes): 为你的威胁模型选择正确的原语(KDF 用于密码,在涉及对手时使用密码学哈希而不是校验和),并请注意纯 Dart 执行并不提供严格的恒定时间保证。 你可以在本地复现所有这一切: ``` dart test # vm, node, and chrome dart test -p vm # fast, VM-only iteration ``` ## 实用示例 下方每个代码片段的可运行程序都位于 [example](https://github.com/bitanon/hashlib/tree/master/example) 文件夹中。 ### 哈希、校验和、MAC 和 OTP ``` import 'package:hashlib/codecs.dart'; import 'package:hashlib/hashlib.dart'; void main() { var text = "Happy Hashing!"; print("text => $text"); final key = "password"; final salt = "some salt"; print("key => $key"); print("salt => $salt"); print(''); final pw = key.codeUnits; final iv = salt.codeUnits; // Example of hash-code generations print('XXH32 => ${xxh32code(text)}'); print('CRC32 => ${crc32code(text)}'); print('Adler32 => ${adler32code(text)}'); print('CRC16 => ${crc16code(text)}'); print(''); // Examples of Hash generation print('CRC64 => ${crc64sum(text)}'); print('XXH64 => ${xxh64sum(text)}'); print('XXH3 => ${xxh3sum(text)}'); print('XXH128 => ${xxh128sum(text)}'); print('MD2 => ${md2.string(text)}'); print('MD4 => ${md4.string(text)}'); print('MD5 => ${md5.string(text)}'); print('SHA-1 => ${sha1.string(text)}'); print('SHA-224 => ${sha224.string(text)}'); print('SHA-256 => ${sha256.string(text)}'); print('SHA-384 => ${sha384.string(text)}'); print('SHA-512 => ${sha512.string(text)}'); print('SHA-512/224 => ${sha512t224.string(text)}'); print('SHA-512/256 => ${sha512t256.string(text)}'); print('SHA3-224 => ${sha3_224.string(text)}'); print('SHA3-256 => ${sha3_256.string(text)}'); print('SHA3-384 => ${sha3_384.string(text)}'); print('SHA3-512 => ${sha3_512.string(text)}'); print('Keccak-224 => ${keccak224.string(text)}'); print('Keccak-256 => ${keccak256.string(text)}'); print('Keccak-384 => ${keccak384.string(text)}'); print('Keccak-512 => ${keccak512.string(text)}'); print('SHAKE-128 => ${shake128.of(20).string(text)}'); print('SHAKE-256 => ${shake256.of(20).string(text)}'); print('BLAKE2s-256 => ${blake2s256.string(text)}'); print('BLAKE2b-512 => ${blake2b512.string(text)}'); print('SM3 => ${sm3.string(text)}'); print(''); // Examples of MAC generations print('HMAC/MD5 => ${md5.hmac.by(pw).string(text)}'); print('HMAC/SHA1 => ${sha1.hmac.byString(text)}'); print('HMAC/SHA256 => ${sha256.hmac.byString(key).string(text)}'); print('HMAC/SHA3-256 => ${HMAC(sha3_256).by(pw).string(text)}'); print("HMAC/BLAKE2b-256 => ${blake2b512.hmac.by(pw).string(text)}"); print("BLAKE-2b-MAC/256 => ${blake2b256.mac.by(pw).string(text)}"); print("BLAKE-2b-MAC/224 => ${Blake2b(28).mac.by(pw).string(text)}"); print(''); // Examples of OTP generation int nw = DateTime.now().millisecondsSinceEpoch ~/ 30000; var counter = fromHex(nw.toRadixString(16).padLeft(16, '0')); print('TOTP[time=$nw] => ${TOTP(iv).value()}'); print('HOTP[counter=$nw] => ${HOTP(iv, counter: counter).value()}'); print(''); } ``` ### 密码与密钥派生 ``` import 'package:hashlib/hashlib.dart'; void main() { final key = "password"; final salt = "some salt"; print("key => $key"); print("salt => $salt"); print(''); final pw = key.codeUnits; final iv = salt.codeUnits; // Examples of Argon2 key derivation final argon2Test = Argon2Security.test; print("[Argon2i] => ${argon2i(pw, iv, security: argon2Test)}"); print("[Argon2d] => ${argon2d(pw, iv, security: argon2Test)}"); print("[Argon2id] => ${argon2id(pw, iv, security: argon2Test)}"); // Examples of scrypt key derivation final scryptLittle = ScryptSecurity.little; print("[scrypt] => ${scrypt(pw, iv, security: scryptLittle, dklen: 24)}"); print(''); // Examples of bcrypt key derivation final bcryptLittle = BcryptSecurity.little; print("[bcrypt] => ${bcrypt(pw, bcryptSalt(security: bcryptLittle))}"); print(''); // Examples of PBKDF2 key derivation print("SHA256/HMAC/PBKDF2 => ${pbkdf2(pw, iv).hex()}"); print("BLAKE2b-256/HMAC/PBKDF2 => ${blake2b256.pbkdf2(iv).hex(pw)}"); print("BLAKE2b-256/MAC/PBKDF2 => ${blake2b256.mac.pbkdf2(iv).hex(pw)}"); print("SHA1/HMAC/PBKDF2 => ${sha1.pbkdf2(iv, iterations: 100).hex(pw)}"); print(''); } ``` ### 安全随机数与 UUID ``` import 'package:hashlib/codecs.dart'; import 'package:hashlib/random.dart'; void main() { print('UUID Generation:'); print('UUIDv1: ${uuid.v1()}'); print('UUIDv3: ${uuid.v3()}'); print('UUIDv4: ${uuid.v4()}'); print('UUIDv5: ${uuid.v5()}'); print('UUIDv6: ${uuid.v6()}'); print('UUIDv7: ${uuid.v7()}'); print('UUIDv8: ${uuid.v8()}'); print(''); print('Random Generation:'); print(randomNumbers(4)); print(toHex(randomBytes(16))); print(randomString(32, lower: true, whitelist: '_'.codeUnits)); print(''); } ``` ## 基准测试 与其他纯 Dart 哈希库进行的测量对比: - **Hashlib** : https://pub.dev/packages/hashlib - **Crypto** : https://pub.dev/packages/crypto - **PointyCastle** : https://pub.dev/packages/pointycastle - **Hash** : https://pub.dev/packages/hash
使用 5MB 消息(10 次迭代): | 算法 | `hashlib` | `PointyCastle` | `crypto` | `hash` | | ------------- | ------------- | ------------------------------ | --------------------------- | -------------------------- | | MD4 | **1.64 Gbps** | 352 Mbps
`4.66x slow` | | | | MD5 | **1.45 Gbps** | 347 Mbps
`4.18x slow` | 1.01 Gbps
`1.44x slow` | 651 Mbps
`2.23x slow` | | HMAC(MD5) | **1.33 Gbps** | | 991 Mbps
`1.34x slow` | 653 Mbps
`2.04x slow` | | SHA-1 | **1.27 Gbps** | 248 Mbps
`5.13x slow` | 794 Mbps
`1.61x slow` | 388 Mbps
`3.28x slow` | | HMAC(SHA-1) | **1.28 Gbps** | | 793 Mbps
`1.61x slow` | | | SHA-224 | **856 Mbps** | 152 Mbps
`5.65x slow` | 685 Mbps
`1.25x slow` | 198 Mbps
`4.32x slow` | | SHA-256 | **859 Mbps** | 151 Mbps
`5.67x slow` | 686 Mbps
`1.25x slow` | 198 Mbps
`4.35x slow` | | HMAC(SHA-256) | **858 Mbps** | | 688 Mbps
`1.25x slow` | | | SHA-384 | **1.36 Gbps** | 17.35 Mbps
`78.24x slow` | 466 Mbps
`2.91x slow` | 162 Mbps
`8.37x slow` | | SHA-512 | **1.36 Gbps** | 17.59 Mbps
`77.15x slow` | 470 Mbps
`2.89x slow` | 160 Mbps
`8.46x slow` | | SHA3-224 | **857 Mbps** | 14.97 Mbps
`57.25x slow` | | | | SHA3-256 | **857 Mbps** | 14.17 Mbps
`60.48x slow` | | | | SHA3-384 | **1.36 Gbps** | 10.85 Mbps
`125.22x slow` | | | | SHA3-512 | **1.37 Gbps** | 7.49 Mbps
`182.3x slow` | | | | RIPEMD-128 | **1.79 Gbps** | 247 Mbps
`7.24x slow` | | | | RIPEMD-160 | **698 Mbps** | 174 Mbps
`4x slow` | | 290 Mbps
`2.41x slow` | | RIPEMD-256 | **2 Gbps** | 218 Mbps
`9.16x slow` | | | | RIPEMD-320 | **684 Mbps** | 161 Mbps
`4.26x slow` | | | | BLAKE-2s | **1.49 Gbps** | | | | | BLAKE-2b | **1.53 Gbps** | 71.06 Mbps
`21.6x slow` | | | | Poly1305 | **3.79 Gbps** | 362 Mbps
`10.48x slow` | | | | XXH32 | **4.5 Gbps** | | | | | XXH64 | **2.42 Gbps** | | | | | XXH3 | **976 Mbps** | | | | | XXH128 | **1.03 Gbps** | | | | | SM3 | **751 Mbps** | 135 Mbps
`5.57x slow` | | |
使用 1KB 消息(5000 次迭代): | 算法 | `hashlib` | `PointyCastle` | `crypto` | `hash` | | ------------- | ------------- | ------------------------------ | -------------------------- | -------------------------- | | MD4 | **1.54 Gbps** | 576 Mbps
`2.67x slow` | | | | MD5 | **1.37 Gbps** | 514 Mbps
`2.66x slow` | 916 Mbps
`1.49x slow` | 643 Mbps
`2.12x slow` | | HMAC(MD5) | **1 Gbps** | | 735 Mbps
`1.36x slow` | 482 Mbps
`2.08x slow` | | SHA-1 | **1.16 Gbps** | 348 Mbps
`3.33x slow` | 714 Mbps
`1.62x slow` | 371 Mbps
`3.12x slow` | | HMAC(SHA-1) | **784 Mbps** | | 505 Mbps
`1.55x slow` | | | SHA-224 | **780 Mbps** | 177 Mbps
`4.41x slow` | 616 Mbps
`1.27x slow` | 187 Mbps
`4.18x slow` | | SHA-256 | **784 Mbps** | 175 Mbps
`4.48x slow` | 615 Mbps
`1.27x slow` | 187 Mbps
`4.19x slow` | | HMAC(SHA-256) | **549 Mbps** | | 433 Mbps
`1.27x slow` | | | SHA-384 | **1.13 Gbps** | 26.94 Mbps
`42.01x slow` | 402 Mbps
`2.82x slow` | 169 Mbps
`6.71x slow` | | SHA-512 | **1.13 Gbps** | 27.88 Mbps
`40.48x slow` | 402 Mbps
`2.81x slow` | 170 Mbps
`6.64x slow` | | SHA3-224 | **782 Mbps** | 20.34 Mbps
`38.46x slow` | | | | SHA3-256 | **783 Mbps** | 20.55 Mbps
`38.11x slow` | | | | SHA3-384 | **1.13 Gbps** | 16.25 Mbps
`69.21x slow` | | | | SHA3-512 | **1.13 Gbps** | 10.89 Mbps
`103.51x slow` | | | | RIPEMD-128 | **1.62 Gbps** | 334 Mbps
`4.87x slow` | | | | RIPEMD-160 | **642 Mbps** | 207 Mbps
`3.1x slow` | | 280 Mbps
`2.29x slow` | | RIPEMD-256 | **1.81 Gbps** | 339 Mbps
`5.34x slow` | | | | RIPEMD-320 | **636 Mbps** | 198 Mbps
`3.22x slow` | | | | BLAKE-2s | **1.43 Gbps** | | | | | BLAKE-2b | **1.47 Gbps** | 95.76 Mbps
`15.38x slow` | | | | Poly1305 | **3.33 Gbps** | 768 Mbps
`4.33x slow` | | | | XXH32 | **4.12 Gbps** | | | | | XXH64 | **2.27 Gbps** | | | | | XXH3 | **784 Mbps** | | | | | XXH128 | **825 Mbps** | | | | | SM3 | **698 Mbps** | 163 Mbps
`4.28x slow` | | |
使用 10B 消息(100000 次迭代): | 算法 | `hashlib` | `PointyCastle` | `crypto` | `hash` | | ------------- | -------------- | ---------------------------- | ---------------------------- | ---------------------------- | | MD4 | **210 Mbps** | 101 Mbps
`2.09x slow` | | | | MD5 | **177 Mbps** | 89.19 Mbps
`1.98x slow` | 92.89 Mbps
`1.9x slow` | 52.25 Mbps
`3.38x slow` | | HMAC(MD5) | **36.18 Mbps** | | 31.69 Mbps
`1.14x slow` | 14.23 Mbps
`2.54x slow` | | SHA-1 | **120 Mbps** | 49.47 Mbps
`2.42x slow` | 69.51 Mbps
`1.72x slow` | 34.29 Mbps
`3.49x slow` | | HMAC(SHA-1) | **19.64 Mbps** | | 14.71 Mbps
`1.34x slow` | | | SHA-224 | **88.2 Mbps** | 26.95 Mbps
`3.27x slow` | 58.57 Mbps
`1.51x slow` | 21.69 Mbps
`4.07x slow` | | SHA-256 | **88.39 Mbps** | 27.12 Mbps
`3.26x slow` | 60.75 Mbps
`1.45x slow` | 22.48 Mbps
`3.93x slow` | | HMAC(SHA-256) | **14.35 Mbps** | | 12.45 Mbps
`1.15x slow` | | | SHA-384 | **65.18 Mbps** | 2.33 Mbps
`27.95x slow` | 26.99 Mbps
`2.42x slow` | 11.16 Mbps
`5.84x slow` | | SHA-512 | **64.21 Mbps** | 2.35 Mbps
`27.3x slow` | 26.59 Mbps
`2.41x slow` | 11.39 Mbps
`5.64x slow` | | SHA3-224 | **88.02 Mbps** | 1.57 Mbps
`55.89x slow` | | | | SHA3-256 | **89.16 Mbps** | 1.56 Mbps
`57.23x slow` | | | | SHA3-384 | **64.5 Mbps** | 1.57 Mbps
`41.07x slow` | | | |3-512 | **63.11 Mbps** | 1.57 Mbps
`40.2x slow` | | | | RIPEMD-128 | **177 Mbps** | 58.35 Mbps
`3.03x slow` | | | | RIPEMD-160 | **86.81 Mbps** | 33.18 Mbps
`2.62x slow` | | 32.16 Mbps
`2.7x slow` | | RIPEMD-256 | **180 Mbps** | 53.17 Mbps
`3.39x slow` | | | | RIPEMD-320 | **85.18 Mbps** | 30.48 Mbps
`2.79x slow` | | | | BLAKE-2s | **152 Mbps** | | | | | BLAKE-2b | **120 Mbps** | 6.89 Mbps
`17.44x slow` | | | | Poly1305 | **269 Mbps** | 167 Mbps
`1.61x slow` | | | | XXH32 | **413 Mbps** | | | | | XXH64 | **332 Mbps** | | | | | XXH3 | **32.94 Mbps** | | | | | XXH128 | **33.16 Mbps** | | | | | SM3 | **93.33 Mbps** | 24.81 Mbps
`3.76x slow` | | |
不同安全参数下的密钥派生器基准测试: | 算法 | little | moderate | good | strong | | ------- | -------- | --------- | ---------- | ----------- | | scrypt | 1.092 ms | 11.899 ms | 69.138 ms | 2100.983 ms | | bcrypt | 1.803 ms | 14.474 ms | 226.341 ms | 1811.425 ms | | pbkdf2 | 0.668 ms | 16.363 ms | 267.526 ms | 3211.098 ms | | argon2i | 2.359 ms | 17.448 ms | 205.518 ms | 2375.301 ms | | argon2d | 2.272 ms | 16.064 ms | 201.827 ms | 2374.41 ms | | argon2id| 2.306 ms | 16.38 ms | 199.66 ms | 2376.102 ms |
标签:AI工具, Dart, 哈希算法, 密码学库, 密钥派生, 校验和