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.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"