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 , argon2Verify |
RFC-9106 |
PBKDF2 | PBKDF2 , pbkdf2 , #.pbkdf2 |
RFC-8081 |
scrypt | Scrypt , scrypt , |
RFC-7914 |
bcrypt | Bcrypt , bcrypt , bcryptSalt , bcryptVerify , bcryptDigest |
Message Authentication Code (MAC) Generators
Algorithms | Available methods | Source |
---|---|---|
HMAC | HMAC , #.hmac |
RFC-2104 |
Poly1305 | Poly1305 , poly1305 , poly1305auth |
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 |
Random Algorithm
Random number generators
Accessible through HashlibRandom
:
- secure
- system
- keccak
- sha256
- md5
- xxh64
- sm3
UUID generators
Accessible through uuid
- v1
- v3
- v4
- v5
- v6
- v7
- v8
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.
Hashilb Example
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('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('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('');
}
Key Generation Example
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('');
}
Random Example
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('');
}
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 | 1.59 Gbps | 836 Mbps 1.9x slow |
||
MD5 | 1.42 Gbps | 728 Mbps 1.95x slow |
1.15 Gbps 1.23x slow |
617 Mbps 2.3x slow |
HMAC(MD5) | 1.37 Gbps | 1.13 Gbps 1.21x slow |
615 Mbps 2.23x slow |
|
SHA-1 | 1.25 Gbps | 439 Mbps 2.84x slow |
861 Mbps 1.45x slow |
351 Mbps 3.55x slow |
HMAC(SHA-1) | 1.25 Gbps | 858 Mbps 1.46x slow |
||
SHA-224 | 823 Mbps | 179 Mbps 4.59x slow |
744 Mbps 1.11x slow |
172 Mbps 4.78x slow |
SHA-256 | 827 Mbps | 181 Mbps 4.57x slow |
746 Mbps 1.11x slow |
172 Mbps 4.79x slow |
HMAC(SHA-256) | 819 Mbps | 740 Mbps 1.11x slow |
||
SHA-384 | 1.32 Gbps | 46.07 Mbps 28.59x slow |
445 Mbps 2.96x slow |
151 Mbps 8.74x slow |
SHA-512 | 1.32 Gbps | 44.17 Mbps 29.77x slow |
443 Mbps 2.97x slow |
150 Mbps 8.74x slow |
SHA3-224 | 823 Mbps | 27.88 Mbps 29.52x slow |
||
SHA3-256 | 826 Mbps | 26.6 Mbps 31.06x slow |
||
SHA3-384 | 1.31 Gbps | 20.37 Mbps 64.17x slow |
||
SHA3-512 | 1.31 Gbps | 13.97 Mbps 93.79x slow |
||
RIPEMD-128 | 1.77 Gbps | 378 Mbps 4.69x slow |
||
RIPEMD-160 | 559 Mbps | 239 Mbps 2.34x slow |
281 Mbps 1.99x slow |
|
RIPEMD-256 | 1.91 Gbps | 373 Mbps 5.11x slow |
||
RIPEMD-320 | 543 Mbps | 237 Mbps 2.29x slow |
||
BLAKE-2s | 1.2 Gbps | |||
BLAKE-2b | 1.38 Gbps | 105 Mbps 13.12x slow |
||
Poly1305 | 2.2 Gbps | 1.24 Gbps 1.77x slow |
||
XXH32 | 3.84 Gbps | |||
XXH64 | 2.63 Gbps | |||
XXH3 | 987 Mbps | |||
XXH128 | 985 Mbps | |||
SM3 | 637 Mbps | 185 Mbps 3.44x slow |
With 1KB message (5000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD4 | 1.51 Gbps | 795 Mbps 1.9x slow |
||
MD5 | 1.34 Gbps | 684 Mbps 1.96x slow |
1.08 Gbps 1.24x slow |
804 Mbps 1.67x slow |
HMAC(MD5) | 1.01 Gbps | 886 Mbps 1.14x slow |
608 Mbps 1.66x slow |
|
SHA-1 | 1.16 Gbps | 416 Mbps 2.79x slow |
809 Mbps 1.44x slow |
395 Mbps 2.93x slow |
HMAC(SHA-1) | 773 Mbps | 578 Mbps 1.34x slow |
||
SHA-224 | 763 Mbps | 170 Mbps 4.49x slow |
694 Mbps 1.1x slow |
174 Mbps 4.39x slow |
SHA-256 | 763 Mbps | 170 Mbps 4.49x slow |
692 Mbps 1.1x slow |
174 Mbps 4.38x slow |
HMAC(SHA-256) | 519 Mbps | 500 Mbps 1.04x slow |
||
SHA-384 | 1.14 Gbps | 40.79 Mbps 27.98x slow |
391 Mbps 2.92x slow |
165 Mbps 6.92x slow |
SHA-512 | 1.14 Gbps | 40.88 Mbps 27.87x slow |
391 Mbps 2.92x slow |
166 Mbps 6.87x slow |
SHA3-224 | 767 Mbps | 25.06 Mbps 30.59x slow |
||
SHA3-256 | 767 Mbps | 25.03 Mbps 30.66x slow |
||
SHA3-384 | 1.14 Gbps | 20.05 Mbps 56.82x slow |
||
SHA3-512 | 1.14 Gbps | 13.41 Mbps 85.04x slow |
||
RIPEMD-128 | 1.63 Gbps | 359 Mbps 4.56x slow |
||
RIPEMD-160 | 535 Mbps | 229 Mbps 2.34x slow |
286 Mbps 1.87x slow |
|
RIPEMD-256 | 1.77 Gbps | 356 Mbps 4.96x slow |
||
RIPEMD-320 | 509 Mbps | 224 Mbps 2.28x slow |
||
BLAKE-2s | 1.18 Gbps | |||
BLAKE-2b | 1.34 Gbps | 104 Mbps 12.91x slow |
||
Poly1305 | 2.12 Gbps | 1.23 Gbps 1.72x slow |
||
XXH32 | 4.12 Gbps | |||
XXH64 | 2.54 Gbps | |||
XXH3 | 918 Mbps | |||
XXH128 | 925 Mbps | |||
SM3 | 599 Mbps | 174 Mbps 3.43x slow |
With 10B message (100000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD4 | 261 Mbps | 138 Mbps 1.89x slow |
||
MD5 | 242 Mbps | 118 Mbps 2.05x slow |
125 Mbps 1.94x slow |
66.64 Mbps 3.63x slow |
HMAC(MD5) | 35.22 Mbps | 38.21 Mbps 1.08x fast |
17.63 Mbps 2x slow |
|
SHA-1 | 152 Mbps | 64.91 Mbps 2.34x slow |
97.82 Mbps 1.55x slow |
42.4 Mbps 3.58x slow |
HMAC(SHA-1) | 19.18 Mbps | 17.66 Mbps 1.09x slow |
||
SHA-224 | 107 Mbps | 27.04 Mbps 3.97x slow |
81.07 Mbps 1.32x slow |
22.87 Mbps 4.7x slow |
SHA-256 | 107 Mbps | 26.91 Mbps 3.98x slow |
82.72 Mbps 1.3x slow |
23.14 Mbps 4.63x slow |
HMAC(SHA-256) | 13.54 Mbps | 14.94 Mbps 1.1x fast |
||
SHA-384 | 81.51 Mbps | 3.49 Mbps 23.36x slow |
29.83 Mbps 2.73x slow |
11.84 Mbps 6.89x slow |
SHA-512 | 81 Mbps | 3.52 Mbps 23.02x slow |
29.68 Mbps 2.73x slow |
11.94 Mbps 6.78x slow |
SHA3-224 | 107 Mbps | 1.9 Mbps 56.53x slow |
||
SHA3-256 | 107 Mbps | 1.9 Mbps 56.4x slow |
||
SHA3-384 | 80.78 Mbps | 1.9 Mbps 42.47x slow |
||
SHA3-512 | 81.33 Mbps | 1.9 Mbps 42.87x slow |
||
RIPEMD-128 | 233 Mbps | 60.55 Mbps 3.85x slow |
||
RIPEMD-160 | 80.32 Mbps | 36.69 Mbps 2.19x slow |
34.53 Mbps 2.33x slow |
|
RIPEMD-256 | 238 Mbps | 58.04 Mbps 4.1x slow |
||
RIPEMD-320 | 76.66 Mbps | 34.48 Mbps 2.22x slow |
||
BLAKE-2s | 168 Mbps | |||
BLAKE-2b | 140 Mbps | 7.71 Mbps 18.21x slow |
||
Poly1305 | 572 Mbps | 308 Mbps 1.86x slow |
||
XXH32 | 840 Mbps | |||
XXH64 | 656 Mbps | |||
XXH3 | 82.46 Mbps | |||
XXH128 | 83.76 Mbps | |||
SM3 | 101 Mbps | 28.19 Mbps 3.57x slow |
Key derivator algorithm benchmarks on different security parameters:
Algorithms | little | moderate | good | strong |
---|---|---|---|---|
scrypt | 1.589 ms | 16.688 ms | 91.663 ms | 2937.545 ms |
bcrypt | 2.24 ms | 17.077 ms | 273.729 ms | 2155.139 ms |
pbkdf2 | 0.849 ms | 17.091 ms | 283.537 ms | 3419.39 ms |
argon2i | 3.914 ms | 16.474 ms | 215.783 ms | 2598.387 ms |
argon2d | 2.981 ms | 16.98 ms | 207.425 ms | 2563.844 ms |
argon2id | 2.311 ms | 16.491 ms | 205.25 ms | 2576.335 ms |
All benchmarks are done on AMD Ryzen 7 5800X processor and 3200MHz RAM using compiled exe
Dart SDK version: 3.3.3 (stable) (Tue Mar 26 14:21:33 2024 +0000) on "windows_x64"