This library contains implementations of secure hash functions, checksum generators, and key derivation algorithms optimized for Dart.
There is only 1 dependency used by this package:
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 |
Algorithm | Available methods | Source |
---|---|---|
Argon2 | Argon2 , argon2d , argon2i , argon2id |
RFC-9106 |
PBKDF2 | PBKDF2 , pbkdf2 , #.pbkdf2 |
RFC-8081 |
scrypt | scrypt , Scrypt |
RFC-7914 |
Algorithms | Available methods | Source |
---|---|---|
HMAC | HMAC , #.hmac |
RFC-2104 |
Poly1305 | Poly1305 , poly1305 , poly1305pair |
RFC-8439 |
Algorithms | Available methods | Source |
---|---|---|
HOTP | HOTP |
RFC-4226 |
TOTP | TOTP |
RFC-6238 |
Algorithms | Available methods | Source |
---|---|---|
CRC | crc16 , crc32 , crc64 |
Wikipedia |
Alder32 | alder32 |
Wikipedia |
A demo application is available in Google Play Store featuring the capabilities of this package.
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.
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('');
}
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.22 Gbps | 864 Mbps 2.57x slow |
||
MD5 | 1.43 Gbps | 756 Mbps 1.89x slow |
1.14 Gbps 1.25x slow |
638 Mbps 2.24x slow |
HMAC(MD5) | 1.36 Gbps | 1.09 Gbps 1.25x slow |
652 Mbps 2.09x slow |
|
SHA-1 | 1.21 Gbps | 452 Mbps 2.67x slow |
845 Mbps 1.43x slow |
370 Mbps 3.27x slow |
HMAC(SHA-1) | 1.21 Gbps | 834 Mbps 1.45x slow |
||
SHA-224 | 805 Mbps | 181 Mbps 4.45x slow |
739 Mbps 1.09x slow |
173 Mbps 4.65x slow |
SHA-256 | 807 Mbps | 183 Mbps 4.41x slow |
739 Mbps 1.09x slow |
173 Mbps 4.66x slow |
HMAC(SHA-256) | 804 Mbps | 739 Mbps 1.09x slow |
||
SHA-384 | 1.26 Gbps | 44.04 Mbps 28.53x slow |
452 Mbps 2.78x slow |
152 Mbps 8.25x slow |
SHA-512 | 1.27 Gbps | 45.79 Mbps 27.65x slow |
451 Mbps 2.81x slow |
153 Mbps 8.3x slow |
SHA3-256 | 803 Mbps | 26.94 Mbps 29.83x slow |
||
SHA3-512 | 1.26 Gbps | 14.31 Mbps 88.28x slow |
||
RIPEMD-128 | 1.76 Gbps | 376 Mbps 4.7x slow |
||
RIPEMD-160 | 553 Mbps | 232 Mbps 2.39x slow |
279 Mbps 1.98x slow |
|
RIPEMD-256 | 1.91 Gbps | 376 Mbps 5.09x slow |
||
RIPEMD-320 | 550 Mbps | 230 Mbps 2.39x slow |
||
BLAKE-2s | 1.2 Gbps | |||
BLAKE-2b | 1.37 Gbps | 102 Mbps 13.34x slow |
||
Poly1305 | 3.67 Gbps | 1.28 Gbps 2.87x slow |
||
XXH32 | 4.35 Gbps | |||
XXH64 | 4.39 Gbps | |||
XXH3 | 1.01 Gbps | |||
XXH128 | 1.01 Gbps | |||
SM3 | 667 Mbps | 188 Mbps 3.55x slow |
With 1KB message (5000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD4 | 1.99 Gbps | 806 Mbps 2.47x slow |
||
MD5 | 1.34 Gbps | 692 Mbps 1.94x slow |
1.06 Gbps 1.26x slow |
801 Mbps 1.67x slow |
HMAC(MD5) | 1.07 Gbps | 881 Mbps 1.22x slow |
611 Mbps 1.75x slow |
|
SHA-1 | 1.11 Gbps | 425 Mbps 2.6x slow |
797 Mbps 1.39x slow |
401 Mbps 2.75x slow |
HMAC(SHA-1) | 808 Mbps | 579 Mbps 1.4x slow |
||
SHA-224 | 742 Mbps | 172 Mbps 4.3x slow |
691 Mbps 1.07x slow |
172 Mbps 4.32x slow |
SHA-256 | 741 Mbps | 173 Mbps 4.29x slow |
680 Mbps 1.09x slow |
172 Mbps 4.3x slow |
HMAC(SHA-256) | 530 Mbps | 498 Mbps 1.06x slow |
||
SHA-384 | 1.08 Gbps | 40.49 Mbps 26.75x slow |
398 Mbps 2.72x slow |
165 Mbps 6.56x slow |
SHA-512 | 1.09 Gbps | 40.88 Mbps 26.65x slow |
397 Mbps 2.75x slow |
165 Mbps 6.61x slow |
SHA3-256 | 744 Mbps | 25.43 Mbps 29.26x slow |
||
SHA3-512 | 1.1 Gbps | 13.6 Mbps 80.78x slow |
||
RIPEMD-128 | 1.64 Gbps | 355 Mbps 4.61x slow |
||
RIPEMD-160 | 518 Mbps | 218 Mbps 2.37x slow |
292 Mbps 1.77x slow |
|
RIPEMD-256 | 1.77 Gbps | 354 Mbps 5.01x slow |
||
RIPEMD-320 | 516 Mbps | 216 Mbps 2.39x slow |
||
BLAKE-2s | 1.17 Gbps | |||
BLAKE-2b | 1.32 Gbps | 101 Mbps 13.07x slow |
||
Poly1305 | 3.45 Gbps | 1.26 Gbps 2.73x slow |
||
XXH32 | 4.15 Gbps | |||
XXH64 | 4.1 Gbps | |||
XXH3 | 951 Mbps | |||
XXH128 | 943 Mbps | |||
SM3 | 658 Mbps | 177 Mbps 3.71x slow |
With 10B message (100000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD4 | 286 Mbps | 142 Mbps 2.02x slow |
||
MD5 | 252 Mbps | 121 Mbps 2.08x slow |
125 Mbps 2.01x slow |
67.68 Mbps 3.72x slow |
HMAC(MD5) | 44.8 Mbps | 38.62 Mbps 1.16x slow |
17.96 Mbps 2.49x slow |
|
SHA-1 | 143 Mbps | 65.93 Mbps 2.17x slow |
98.48 Mbps 1.45x slow |
42.65 Mbps 3.35x slow |
HMAC(SHA-1) | 22.88 Mbps | 17.64 Mbps 1.3x slow |
||
SHA-224 | 101 Mbps | 27.37 Mbps 3.7x slow |
82.92 Mbps 1.22x slow |
22.88 Mbps 4.43x slow |
SHA-256 | 99.94 Mbps | 27.66 Mbps 3.61x slow |
83.27 Mbps 1.2x slow |
23.09 Mbps 4.33x slow |
HMAC(SHA-256) | 15.5 Mbps | 15.17 Mbps 1.02x slow |
||
SHA-384 | 77.33 Mbps | 3.48 Mbps 22.23x slow |
30.53 Mbps 2.53x slow |
11.94 Mbps 6.48x slow |
SHA-512 | 77.58 Mbps | 3.48 Mbps 22.3x slow |
30.5 Mbps 2.54x slow |
12.03 Mbps 6.45x slow |
SHA3-256 | 101 Mbps | 1.91 Mbps 52.53x slow |
||
SHA3-512 | 77.68 Mbps | 1.91 Mbps 40.58x slow |
||
RIPEMD-128 | 238 Mbps | 57.95 Mbps 4.1x slow |
||
RIPEMD-160 | 79.49 Mbps | 34.7 Mbps 2.29x slow |
35.43 Mbps 2.24x slow |
|
RIPEMD-256 | 243 Mbps | 57.48 Mbps 4.22x slow |
||
RIPEMD-320 | 78.84 Mbps | 33.2 Mbps 2.37x slow |
||
BLAKE-2s | 156 Mbps | |||
BLAKE-2b | 128 Mbps | 7.45 Mbps 17.19x slow |
||
Poly1305 | 538 Mbps | 312 Mbps 1.72x slow |
||
XXH32 | 858 Mbps | |||
XXH64 | 646 Mbps | |||
XXH3 | 88.11 Mbps | |||
XXH128 | 83.12 Mbps | |||
SM3 | 98.72 Mbps | 28.64 Mbps 3.45x slow |
Argon2 and scrypt benchmarks on different security parameters:
Algorithms | test | little | moderate | good | strong |
---|---|---|---|---|---|
scrypt | 0.057 ms | 1.518 ms | 11.05 ms | 87.86 ms | 1440.171 ms |
argon2i | 0.348 ms | 2.539 ms | 16.816 ms | 202.203 ms | 2414.167 ms |
argon2d | 0.312 ms | 2.46 ms | 17.917 ms | 205.445 ms | 2394.531 ms |
argon2id | 0.311 ms | 2.332 ms | 16.581 ms | 200.097 ms | 2420.071 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"