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 |
---|---|---|
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(E) |
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('[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('');
// 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 |
---|---|---|---|---|
MD5 | 170.53MB/s | 81.35MB/s 110% slower |
136.30MB/s 25% slower |
76.73MB/s 122% slower |
HMAC(MD5) | 159.58MB/s | ➖ | 136.15MB/s 17% slower |
76.89MB/s 108% slower |
SHA-1 | 142.59MB/s | 53.02MB/s 169% slower |
102.50MB/s 39% slower |
43.61MB/s 227% slower |
HMAC(SHA-1) | 141.53MB/s | ➖ | 101.98MB/s 39% slower |
➖ |
SHA-224 | 95.10MB/s | 21.01MB/s 352% slower |
87.38MB/s 9% slower |
20.61MB/s 361% slower |
SHA-256 | 94.87MB/s | 21.24MB/s 346% slower |
87.11MB/s 9% slower |
20.53MB/s 362% slower |
HMAC(SHA-256) | 95.04MB/s | ➖ | 87.26MB/s 9% slower |
➖ |
SHA-384 | 151.95MB/s | 4.94MB/s 2974% slower |
53.19MB/s 186% slower |
17.97MB/s 745% slower |
SHA-512 | 151.55MB/s | 4.97MB/s 2946% slower |
53.18MB/s 185% slower |
18.19MB/s 733% slower |
SHA3-256 | 94.98MB/s | 3.21MB/s 2859% slower |
➖ | ➖ |
SHA3-512 | 151.83MB/s | 1.70MB/s 8831% slower |
➖ | ➖ |
RIPEMD-128 | 209.75MB/s | 43.57MB/s 381% slower |
➖ | ➖ |
RIPEMD-160 | 65.42MB/s | 28.20MB/s 132% slower |
➖ | 34.23MB/s 91% slower |
RIPEMD-256 | 224.79MB/s | 43.14MB/s 421% slower |
➖ | ➖ |
RIPEMD-320 | 66.21MB/s | 27.56MB/s 140% slower |
➖ | ➖ |
BLAKE-2s | 142.40MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 163.02MB/s | 12.12MB/s 1244% slower |
➖ | ➖ |
Poly1305 | 432.83MB/s | 152.54MB/s 184% slower |
➖ | ➖ |
XXH32 | 471.74MB/s | ➖ | ➖ | ➖ |
XXH64 | 534.63MB/s | ➖ | ➖ | ➖ |
XXH3 | 118.42MB/s | ➖ | ➖ | ➖ |
XXH128 | 119.06MB/s | ➖ | ➖ | ➖ |
With 1KB message (5000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD5 | 161.58MB/s | 80.23MB/s 101% slower |
127.70MB/s 27% slower |
98.07MB/s 65% slower |
HMAC(MD5) | 129.45MB/s | ➖ | 106.28MB/s 22% slower |
72.41MB/s 79% slower |
SHA-1 | 131.47MB/s | 50.05MB/s 163% slower |
96.13MB/s 37% slower |
47.31MB/s 178% slower |
HMAC(SHA-1) | 98.25MB/s | ➖ | 69.93MB/s 40% slower |
➖ |
SHA-224 | 88.27MB/s | 19.99MB/s 341% slower |
81.18MB/s 9% slower |
20.52MB/s 330% slower |
SHA-256 | 88.17MB/s | 19.93MB/s 342% slower |
81.11MB/s 9% slower |
20.62MB/s 327% slower |
HMAC(SHA-256) | 63.57MB/s | ➖ | 58.88MB/s 8% slower |
➖ |
SHA-384 | 130.47MB/s | 4.46MB/s 2825% slower |
46.76MB/s 179% slower |
19.61MB/s 565% slower |
SHA-512 | 130.27MB/s | 4.44MB/s 2834% slower |
46.79MB/s 178% slower |
19.69MB/s 562% slower |
SHA3-256 | 88.18MB/s | 3MB/s 2835% slower |
➖ | ➖ |
SHA3-512 | 129.73MB/s | 1.59MB/s 8028% slower |
➖ | ➖ |
RIPEMD-128 | 191.74MB/s | 41.07MB/s 367% slower |
➖ | ➖ |
RIPEMD-160 | 60.40MB/s | 26.46MB/s 128% slower |
➖ | 35.69MB/s 69% slower |
RIPEMD-256 | 208.81MB/s | 40.60MB/s 414% slower |
➖ | ➖ |
RIPEMD-320 | 60.47MB/s | 25.77MB/s 135% slower |
➖ | ➖ |
BLAKE-2s | 138.66MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 157.75MB/s | 11.89MB/s 1227% slower |
➖ | ➖ |
Poly1305 | 407.20MB/s | 148.72MB/s 174% slower |
➖ | ➖ |
XXH32 | 449.71MB/s | ➖ | ➖ | ➖ |
XXH64 | 484.08MB/s | ➖ | ➖ | ➖ |
XXH3 | 111.51MB/s | ➖ | ➖ | ➖ |
XXH128 | 111.04MB/s | ➖ | ➖ | ➖ |
With 10B message (100000 iterations):
Algorithms | hashlib |
PointyCastle |
crypto |
hash |
---|---|---|---|---|
MD5 | 28.34MB/s | 14.11MB/s 101% slower |
14.84MB/s 91% slower |
8.08MB/s 251% slower |
HMAC(MD5) | 5.23MB/s | ➖ | 4.47MB/s 17% slower |
2.12MB/s 146% slower |
SHA-1 | 16.28MB/s | 7.77MB/s 110% slower |
11.52MB/s 41% slower |
5.03MB/s 224% slower |
HMAC(SHA-1) | 2.66MB/s | ➖ | 2.05MB/s 30% slower |
➖ |
SHA-224 | 11.98MB/s | 3.22MB/s 272% slower |
9.58MB/s 25% slower |
2.73MB/s 339% slower |
SHA-256 | 11.94MB/s | 3.18MB/s 275% slower |
9.65MB/s 24% slower |
2.75MB/s 334% slower |
HMAC(SHA-256) | 1.87MB/s | ➖ | 1.72MB/s 8% slower |
➖ |
SHA-384 | 9.34MB/s | 387.94KB/s 2366% slower |
3.53MB/s 164% slower |
1.41MB/s 563% slower |
SHA-512 | 9.24MB/s | 387.41KB/s 2345% slower |
3.52MB/s 162% slower |
1.42MB/s 550% slower |
SHA3-256 | 11.89MB/s | 228.04KB/s 5241% slower |
➖ | ➖ |
SHA3-512 | 9.23MB/s | 228.99KB/s 4029% slower |
➖ | ➖ |
RIPEMD-128 | 27.95MB/s | 7MB/s 299% slower |
➖ | ➖ |
RIPEMD-160 | 9.38MB/s | 4.28MB/s 119% slower |
➖ | 4.29MB/s 118% slower |
RIPEMD-256 | 28.46MB/s | 6.73MB/s 322% slower |
➖ | ➖ |
RIPEMD-320 | 9.23MB/s | 4.06MB/s 127% slower |
➖ | ➖ |
BLAKE-2s | 18.85MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 14.82MB/s | 904.52KB/s 1578% slower |
➖ | ➖ |
Poly1305 | 59.63MB/s | 36.50MB/s 63% slower |
➖ | ➖ |
XXH32 | 100.03MB/s | ➖ | ➖ | ➖ |
XXH64 | 76.53MB/s | ➖ | ➖ | ➖ |
XXH3 | 10.48MB/s | ➖ | ➖ | ➖ |
XXH128 | 9.86MB/s | ➖ | ➖ | ➖ |
Argon2 and scrypt benchmarks on different security parameters:
Algorithms | test | little | moderate | good | strong |
---|---|---|---|---|---|
scrypt | 0.058 ms | 1.464 ms | 11.0 ms | 90.375 ms | 1410.816 ms |
argon2i | 0.385 ms | 2.473 ms | 17.017 ms | 208.533 ms | 2481.148 ms |
argon2d | 0.281 ms | 2.416 ms | 17.501 ms | 206.161 ms | 2454.029 ms |
argon2id | 0.285 ms | 2.442 ms | 17.356 ms | 205.749 ms | 2512.451 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"