hashlib 1.17.0
hashlib: ^1.17.0 copied to clipboard
Secure hash functions, checksum generators, and key derivation algorithms optimized for Dart.
hashlib #
This library contains implementations of secure hash functions, checksum generators, and key derivation algorithms optimized for Dart.
Depencencies #
There is only 1 dependency used by this package:
Features #
Block Hash Algorithms #
| Algorithm | Available methods | Source |
|---|---|---|
| MD4 | md4 |
RFC-1320 |
| MD5 | md5 |
RFC-1321 |
| SHA-1 | sha1 |
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 |
GB/T 32905-2016 |
Password / Key Derivation Algorithms #
| Algorithm | Available methods | Source |
|---|---|---|
| Argon2 | Argon2, argon2d, argon2i, argon2id |
RFC-9106 |
| PBKDF2 | PBKDF2, pbkdf2, #.pbkdf2 |
RFC-8081 |
| scrypt | scrypt, Scrypt |
RFC-7914 |
Message Authentication Code (MAC) Generators #
| Algorithms | Available methods | Source |
|---|---|---|
| HMAC | HMAC, #.hmac |
RFC-2104 |
| Poly1305 | Poly1305, poly1305, poly1305pair |
RFC-8439 |
OTP generation for 2FA #
| Algorithms | Available methods | Source |
|---|---|---|
| HOTP | HOTP |
RFC-4226 |
| TOTP | TOTP |
RFC-6238 |
Other Hash Algorithms #
| Algorithms | Available methods | Source |
|---|---|---|
| CRC | crc16, crc32, crc64 |
Wikipedia |
| Alder32 | alder32 |
Wikipedia |
Demo #
A demo application is available in Google Play Store featuring the capabilities of this package.
Getting Started #
The following import will give you access to all of the algorithms in this package.
import 'package:hashlib/hashlib.dart' as hashlib;
Check the API Reference for details.
Usage #
Examples can be found inside the example folder.
import 'package:hashlib/hashlib.dart';
import 'package:hashlib_codecs/hashlib_codecs.dart';
void main() {
var text = "Happy Hashing!";
var key = "password";
var pw = key.codeUnits;
var salt = "some salt".codeUnits;
print("text => $text");
print("key => $key");
print("salt => ${toHex(salt)}");
print('');
// Example of hash code generations
print('[XXH32] => ${xxh32code(text)}');
print('[CRC32] => ${crc32code(text)}');
print('[Alder32] => ${alder32code(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('[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('[BLAKE-2s/256] => ${blake2s256.string(text)}');
print('[BLAKE-2b/512] => ${blake2b512.string(text)}');
print('[SM3] => ${sm3.string(text)}');
print('');
// Examples of MAC generations
print('HMAC[MD5] => ${md5.hmac(pw).string(text)}');
print('HMAC[SHA1] => ${sha1.hmacBy(key).string(text)}');
print('HMAC[SHA256] => ${sha256.hmacBy(key).string(text)}');
print('HMAC[SHA3-256] => ${HMAC(sha3_256, pw).string(text)}');
print("[BLAKE-2b/224] => ${Blake2bMAC(28, pw).string(text)}");
print("[BLAKE-2b/256] => ${blake2b256.mac(pw).string(text)}");
print('');
// Examples of PBKDF2 key derivation
print("PBKDF2[HMAC[SHA256]] => ${pbkdf2(pw, salt, 100)}");
print("PBKDF2[HMAC[SHA1]] => ${sha1.hmac(pw).pbkdf2(salt, 100)}");
print("PBKDF2[BLAKE2b-256-MAC] => ${blake2b256.mac(pw).pbkdf2(salt, 100)}");
print("PBKDF2[HMAC[BLAKE-2b-256]] => ${blake2b256.pbkdf2(pw, salt, 100)}");
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(salt).value()}');
print('HOTP[counter=$nw] => ${HOTP(salt, counter: counter).value()}');
print('');
// Examples of Argon2 key derivation
var argon2Test = Argon2Security.test;
print("[Argon2i] => ${argon2i(pw, salt, security: argon2Test)}");
print("[Argon2d] => ${argon2d(pw, salt, security: argon2Test)}");
print("[Argon2id] => ${argon2id(pw, salt, security: argon2Test)}");
// Examples of scrypt key derivation
var scryptLittle = ScryptSecurity.little;
print("[scrypt] => ${scrypt(pw, salt, security: scryptLittle, dklen: 24)}");
print('');
}
Benchmarks #
Libraries:
- Hashlib : https://pub.dev/packages/hashlib
- Crypto : https://pub.dev/packages/crypto
- PointyCastle : https://pub.dev/packages/pointycastle
- Hash : https://pub.dev/packages/hash
With 5MB message (10 iterations):
| Algorithms | hashlib |
PointyCastle |
crypto |
hash |
|---|---|---|---|---|
| MD4 | 2.26 Gbps | 1.01 Gbps 2.23x slow |
||
| MD5 | 1.53 Gbps | 870 Mbps 1.76x slow |
1.4 Gbps 1.09x slow |
928 Mbps 1.65x slow |
| HMAC(MD5) | 1.51 Gbps | 1.44 Gbps 1.06x slow |
934 Mbps 1.62x slow |
|
| SHA-1 | 1.28 Gbps | 524 Mbps 2.45x slow |
1.14 Gbps 1.12x slow |
532 Mbps 2.41x slow |
| HMAC(SHA-1) | 1.28 Gbps | 1.16 Gbps 1.11x slow |
||
| SHA-224 | 971 Mbps | 245 Mbps 3.96x slow |
914 Mbps 1.06x slow |
245 Mbps 3.97x slow |
| SHA-256 | 1.03 Gbps | 240 Mbps 4.28x slow |
905 Mbps 1.14x slow |
242 Mbps 4.25x slow |
| HMAC(SHA-256) | 1.04 Gbps | 925 Mbps 1.12x slow |
||
| SHA-384 | 1.9 Gbps | 57.57 Mbps 33.05x slow |
661 Mbps 2.88x slow |
183 Mbps 10.41x slow |
| SHA-512 | 1.93 Gbps | 58.29 Mbps 33.13x slow |
663 Mbps 2.91x slow |
185 Mbps 10.43x slow |
| SHA3-256 | 1.04 Gbps | 32.59 Mbps 31.86x slow |
||
| SHA3-512 | 1.92 Gbps | 17.27 Mbps 111.36x slow |
||
| RIPEMD-128 | 1.29 Gbps | 509 Mbps 2.54x slow |
||
| RIPEMD-160 | 699 Mbps | 356 Mbps 1.96x slow |
375 Mbps 1.86x slow |
|
| RIPEMD-256 | 1.42 Gbps | 505 Mbps 2.81x slow |
||
| RIPEMD-320 | 666 Mbps | 346 Mbps 1.93x slow |
||
| BLAKE-2s | 1.52 Gbps | |||
| BLAKE-2b | 2.01 Gbps | 162 Mbps 12.41x slow |
||
| Poly1305 | 4.51 Gbps | 1.52 Gbps 2.97x slow |
||
| XXH32 | 5.42 Gbps | |||
| XXH64 | 5.85 Gbps | |||
| XXH3 | 1.4 Gbps | |||
| XXH128 | 1.47 Gbps | |||
| SM3 | 886 Mbps | 253 Mbps 3.51x slow |
With 1KB message (5000 iterations):
| Algorithms | hashlib |
PointyCastle |
crypto |
hash |
|---|---|---|---|---|
| MD4 | 2.12 Gbps | 965 Mbps 2.19x slow |
||
| MD5 | 1.42 Gbps | 828 Mbps 1.71x slow |
1.3 Gbps 1.09x slow |
1.03 Gbps 1.37x slow |
| HMAC(MD5) | 1.16 Gbps | 1.09 Gbps 1.07x slow |
754 Mbps 1.54x slow |
|
| SHA-1 | 1.18 Gbps | 500 Mbps 2.36x slow |
1.05 Gbps 1.12x slow |
554 Mbps 2.13x slow |
| HMAC(SHA-1) | 841 Mbps | 768 Mbps 1.09x slow |
||
| SHA-224 | 955 Mbps | 229 Mbps 4.16x slow |
835 Mbps 1.14x slow |
239 Mbps 4x slow |
| SHA-256 | 957 Mbps | 232 Mbps 4.12x slow |
838 Mbps 1.14x slow |
239 Mbps 4x slow |
| HMAC(SHA-256) | 681 Mbps | 606 Mbps 1.12x slow |
||
| SHA-384 | 1.58 Gbps | 52.84 Mbps 29.89x slow |
590 Mbps 2.68x slow |
167 Mbps 9.43x slow |
| SHA-512 | 1.6 Gbps | 51.79 Mbps 30.84x slow |
588 Mbps 2.72x slow |
168 Mbps 9.53x slow |
| SHA3-256 | 956 Mbps | 30.62 Mbps 31.23x slow |
||
| SHA3-512 | 1.6 Gbps | 16.4 Mbps 97.3x slow |
||
| RIPEMD-128 | 1.2 Gbps | 480 Mbps 2.5x slow |
||
| RIPEMD-160 | 656 Mbps | 334 Mbps 1.96x slow |
376 Mbps 1.75x slow |
|
| RIPEMD-256 | 1.33 Gbps | 478 Mbps 2.78x slow |
||
| RIPEMD-320 | 627 Mbps | 330 Mbps 1.9x slow |
||
| BLAKE-2s | 1.57 Gbps | |||
| BLAKE-2b | 1.98 Gbps | 160 Mbps 12.36x slow |
||
| Poly1305 | 4.28 Gbps | 1.5 Gbps 2.85x slow |
||
| XXH32 | 4.94 Gbps | |||
| XXH64 | 5.44 Gbps | |||
| XXH3 | 1.32 Gbps | |||
| XXH128 | 1.32 Gbps | |||
| SM3 | 830 Mbps | 236 Mbps 3.52x slow |
With 10B message (100000 iterations):
| Algorithms | hashlib |
PointyCastle |
crypto |
hash |
|---|---|---|---|---|
| MD4 | 334 Mbps | 185 Mbps 1.81x slow |
||
| MD5 | 264 Mbps | 156 Mbps 1.69x slow |
160 Mbps 1.65x slow |
78.48 Mbps 3.36x slow |
| HMAC(MD5) | 50.09 Mbps | 46.17 Mbps 1.08x slow |
21.6 Mbps 2.32x slow |
|
| SHA-1 | 156 Mbps | 83.85 Mbps 1.86x slow |
122 Mbps 1.28x slow |
58.19 Mbps 2.68x slow |
| HMAC(SHA-1) | 24.18 Mbps | 22.01 Mbps 1.1x slow |
||
| SHA-224 | 125 Mbps | 37.54 Mbps 3.34x slow |
102 Mbps 1.23x slow |
31.53 Mbps 3.98x slow |
| SHA-256 | 125 Mbps | 37.7 Mbps 3.33x slow |
103 Mbps 1.22x slow |
31.64 Mbps 3.96x slow |
| HMAC(SHA-256) | 19.5 Mbps | 17.87 Mbps 1.09x slow |
||
| SHA-384 | 107 Mbps | 4.55 Mbps 23.63x slow |
44.43 Mbps 2.42x slow |
14.32 Mbps 7.5x slow |
| SHA-512 | 107 Mbps | 4.46 Mbps 24.01x slow |
44.1 Mbps 2.43x slow |
14.58 Mbps 7.35x slow |
| SHA3-256 | 126 Mbps | 2.32 Mbps 54.28x slow |
||
| SHA3-512 | 107 Mbps | 2.31 Mbps 46.31x slow |
||
| RIPEMD-128 | 194 Mbps | 85.85 Mbps 2.26x slow |
||
| RIPEMD-160 | 105 Mbps | 58.39 Mbps 1.8x slow |
45.19 Mbps 2.32x slow |
|
| RIPEMD-256 | 210 Mbps | 80.76 Mbps 2.6x slow |
||
| RIPEMD-320 | 101 Mbps | 54.23 Mbps 1.87x slow |
||
| BLAKE-2s | 188 Mbps | |||
| BLAKE-2b | 153 Mbps | 11.09 Mbps 13.76x slow |
||
| Poly1305 | 733 Mbps | 438 Mbps 1.67x slow |
||
| XXH32 | 1.1 Gbps | |||
| XXH64 | 858 Mbps | |||
| XXH3 | 109 Mbps | |||
| XXH128 | 105 Mbps | |||
| SM3 | 129 Mbps | 39.46 Mbps 3.27x slow |
Argon2 and scrypt benchmarks on different security parameters:
| Algorithms | test | little | moderate | good | strong |
|---|---|---|---|---|---|
| scrypt | 0.048 ms | 1.123 ms | 8.501 ms | 69.45 ms | 1080.798 ms |
| argon2i | 0.272 ms | 2.26 ms | 15.143 ms | 193.404 ms | 2092.091 ms |
| argon2d | 0.199 ms | 2.085 ms | 14.863 ms | 192.37 ms | 2057.96 ms |
| argon2id | 0.212 ms | 2.127 ms | 15.0 ms | 191.927 ms | 2071.661 ms |
All benchmarks are done on 36GB Apple M3 Pro using compiled exe
Dart SDK version: 3.4.0 (stable) (Mon May 6 07:59:58 2024 -0700) on "macos_arm64"

