hashlib 1.8.1
hashlib: ^1.8.1 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.
Features #
Secure Hash Algorithms #
Algorithm | Available methods | Source |
---|---|---|
SHA-2 | sha224 , sha256 , sha384 , sha512 , sha512t224 , sha512t256 |
RCC-6234 |
SHA-3 | sha3_224 , sha3_256 , sha3_384 , sha3_512 |
FIPS-202 |
SHAKE | Shake128 , Shake256 , shake128 , shake256 |
FIPS-202 |
Keccak | keccak224 , keccak256 , keccak384 , keccak512 |
Team Keccak |
Blake2b | blake2b160 , blake2b256 , blake2b384 , blake2b512 |
RFC-7693 |
Blake2s | blake2s128 , blake2s160 , blake2s224 , blake2s256 |
RFC-7693 |
Non-Cryptographic Hash Algorithms #
Algorithms | Available methods | Source |
---|---|---|
MD5 | md5 |
RFC-1321 |
SHA-1 | sha1 |
RFC-3174 |
xxHash-32 | XXHash32 ,xxh32 ,xxh32code |
Cyan4973 |
xxHash-64 | XXHash64 ,xxh64 ,xxh64code |
Cyan4973 |
xxHash3-64 | XXH3 ,xxh3 ,xxh3code |
Cyan4973 |
xxHash3-128 | XXH128 ,xxh128 ,xxh128code |
Cyan4973 |
CRC | crc16 ,crc32 ,crc64 |
Wikipedia |
Alder32 | alder32 |
Wikipedia |
Password / Key Derivation Algorithms #
Algorithm | Available methods | Source |
---|---|---|
Argon2 | Argon2 , argon2d , argon2i , argon2id |
RFC-9106 |
PBKDF2 | PBKDF2 |
RFC-8081 |
Message Authentication Code (MAC) Generators #
Algorithms | Available methods | Source |
---|---|---|
HMAC | HMAC |
RFC-2104 |
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 'dart:convert';
import 'package:hashlib/hashlib.dart';
import 'package:hashlib/src/core/utils.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[MD5] => ${md5.hmacBy(key, utf8).string(text)}');
print('HMAC[MD5] => ${md5.hmacBy(key).string(text)}');
print('HMAC[MD5] => ${HMAC(md5, pw).string(text)}');
print("[BLAKE-2b/256] => ${blake2b256.mac(pw).string(text)}");
print("[BLAKE-2b/256] => ${Blake2bMAC(32, pw).string(text)}");
print('');
// Examples of PBKDF2 key derivation
print("PBKDF2[HMAC[SHA-256]] => ${sha256.pbkdf2(pw, salt, 100)}");
print("PBKDF2[HMAC[SHA-256]] => ${sha256.hmac(pw).pbkdf2(salt, 100)}");
print("PBKDF2[BLAKE-2b-MAC] => ${blake2b256.mac(pw).pbkdf2(salt, 100)}");
print("PBKDF2[HMAC[BLAKE-2b]] => ${blake2b256.pbkdf2(pw, salt, 100)}");
print("PBKDF2[HMAC[BLAKE-2b]] => ${blake2b256.hmac(pw).pbkdf2(salt, 100)}");
print('');
// Examples of Argon2 key derivation
var security = Argon2Security.test;
print("[Argon2i] => ${argon2i(pw, salt, security: security)}");
print("[Argon2d] => ${argon2d(pw, salt, security: security)}");
print("[Argon2id] => ${argon2id(pw, salt, security: security)}");
}
Benchmarks #
To obtain the following benchmarks, run this command:
dart compile exe ./benchmark/benchmark.dart && ./benchmark/benchmark.exe
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 string of length 10 (100000 iterations):
Algorithms | hashlib |
crypto |
hash |
PointyCastle |
---|---|---|---|---|
XXH64 | 67.24MB/s | ➖ | ➖ | ➖ |
XXH3 | 8.56MB/s | ➖ | ➖ | ➖ |
MD5 | 22.80MB/s | 10.23MB/s 123% slower |
7.47MB/s 205% slower |
11.39MB/s 100% slower |
SHA-1 | 17.38MB/s | 8.74MB/s 99% slower |
4.76MB/s 265% slower |
7.37MB/s 136% slower |
SHA-224 | 12.30MB/s | 7.24MB/s 70% slower |
2.49MB/s 395% slower |
3.16MB/s 289% slower |
SHA-256 | 12.28MB/s | 7.29MB/s 68% slower |
2.62MB/s 368% slower |
3.18MB/s 286% slower |
SHA-384 | 9.44MB/s | 2.98MB/s 216% slower |
1.28MB/s 639% slower |
397.37KB/s 2276% slower |
SHA-512 | 9.36MB/s | 2.98MB/s 214% slower |
1.34MB/s 597% slower |
396.35KB/s 2262% slower |
SHA-512/224 | 9.57MB/s | 3.02MB/s 217% slower |
➖ | 201.40KB/s 4652% slower |
SHA-512/256 | 9.54MB/s | 3.00MB/s 218% slower |
➖ | 201.98KB/s 4623% slower |
SHA3-256 | 12.33MB/s | ➖ | ➖ | 219.98KB/s 5505% slower |
SHA3-512 | 9.36MB/s | ➖ | ➖ | 219.72KB/s 4162% slower |
BLAKE-2s | 14.83MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 12.63MB/s | ➖ | ➖ | 813.14KB/s 1453% slower |
HMAC(MD5) | 4.67MB/s | 3.75MB/s 24% slower |
1.95MB/s 140% slower |
➖ |
HMAC(SHA-256) | 1.89MB/s | 1.57MB/s 20% slower |
➖ | ➖ |
With string of length 1000 (5000 iterations):
Algorithms | hashlib |
crypto |
hash |
PointyCastle |
---|---|---|---|---|
XXH64 | 454.17MB/s | ➖ | ➖ | ➖ |
XXH3 | 105.77MB/s | ➖ | ➖ | ➖ |
MD5 | 155.56MB/s | 116.70MB/s 33% slower |
89.72MB/s 73% slower |
79.40MB/s 96% slower |
SHA-1 | 146.49MB/s | 94.75MB/s 55% slower |
46.52MB/s 215% slower |
54.18MB/s 170% slower |
SHA-224 | 97.16MB/s | 78.68MB/s 23% slower |
20.99MB/s 363% slower |
20.98MB/s 363% slower |
SHA-256 | 97.22MB/s | 78.19MB/s 24% slower |
20.95MB/s 364% slower |
20.97MB/s 364% slower |
SHA-384 | 143.92MB/s | 46.98MB/s 206% slower |
21.39MB/s 573% slower |
5.21MB/s 2665% slower |
SHA-512 | 148.22MB/s | 47.41MB/s 213% slower |
21.50MB/s 589% slower |
5.21MB/s 2745% slower |
SHA-512/224 | 145.98MB/s | 47.04MB/s 210% slower |
➖ | 4.61MB/s 3068% slower |
SHA-512/256 | 144.80MB/s | 47.35MB/s 206% slower |
➖ | 4.61MB/s 3042% slower |
SHA3-256 | 96.78MB/s | ➖ | ➖ | 2.88MB/s 3266% slower |
SHA3-512 | 145.49MB/s | ➖ | ➖ | 1.66MB/s 8685% slower |
BLAKE-2s | 133.86MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 153.35MB/s | ➖ | ➖ | 11.53MB/s 1231% slower |
HMAC(MD5) | 122.39MB/s | 94.73MB/s 29% slower |
67.13MB/s 82% slower |
➖ |
HMAC(SHA-256) | 67.48MB/s | 55.64MB/s 21% slower |
➖ | ➖ |
With string of length 500000 (10 iterations):
Algorithms | hashlib |
crypto |
hash |
PointyCastle |
---|---|---|---|---|
XXH64 | 484.62MB/s | ➖ | ➖ | ➖ |
XXH3 | 116.98MB/s | ➖ | ➖ | ➖ |
MD5 | 161.57MB/s | 123.35MB/s 31% slower |
69.18MB/s 134% slower |
83.05MB/s 95% slower |
SHA-1 | 153.49MB/s | 97.47MB/s 57% slower |
40.97MB/s 275% slower |
56.68MB/s 171% slower |
SHA-224 | 101.25MB/s | 82.35MB/s 23% slower |
20.11MB/s 404% slower |
21.55MB/s 370% slower |
SHA-256 | 101.56MB/s | 82.32MB/s 23% slower |
20.02MB/s 407% slower |
21.69MB/s 368% slower |
SHA-384 | 160.98MB/s | 49.18MB/s 227% slower |
17.69MB/s 810% slower |
5.34MB/s 2913% slower |
SHA-512 | 162.20MB/s | 49.22MB/s 230% slower |
17.68MB/s 817% slower |
5.34MB/s 2938% slower |
SHA-512/224 | 161.66MB/s | 49.25MB/s 228% slower |
➖ | 5.34MB/s 2930% slower |
SHA-512/256 | 161.52MB/s | 49.16MB/s 229% slower |
➖ | 5.35MB/s 2921% slower |
SHA3-256 | 101.83MB/s | ➖ | ➖ | 3.15MB/s 3129% slower |
SHA3-512 | 160.89MB/s | ➖ | ➖ | 1.67MB/s 9543% slower |
BLAKE-2s | 141.52MB/s | ➖ | ➖ | ➖ |
BLAKE-2b | 162.45MB/s | ➖ | ➖ | 12.14MB/s 1238% slower |
HMAC(MD5) | 162.09MB/s | 123.68MB/s 31% slower |
69.42MB/s 133% slower |
➖ |
HMAC(SHA-256) | 101.54MB/s | 82.08MB/s 24% slower |
➖ | ➖ |
Argon2 benchmarks on different security parameters:
Algorithms | test | little | moderate | good | strong |
---|---|---|---|---|---|
argon2i | 0.378 ms | 2.62 ms | 17.917 ms | 219.696 ms | 2504.115 ms |
argon2d | 0.334 ms | 2.747 ms | 19.035 ms | 239.565 ms | 2508.532 ms |
argon2id | 0.323 ms | 2.631 ms | 17.18 ms | 214.449 ms | 2538.26 ms |
These benchmarks were done in AMD Ryzen 7 5800X processor and 3200MHz RAM using compiled exe on Windows 10