Traits which describe functionality of cryptographic hash functions, a.k.a. digest algorithms.
See RustCrypto/hashes for implementations which use this trait.
Rust 1.41 or higher.
Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump.
Let us demonstrate how to use crates in this repository using BLAKE2b as an example.
First add blake2
crate to your Cargo.toml
:
[dependencies] blake2 = "0.8"
blake2
and other crates re-export digest
crate and Digest
trait for convenience, so you don't have to add digest
crate as an explicit dependency.
Now you can write the following code:
use blake2::{Blake2b, Digest}; let mut hasher = Blake2b::new(); let data = b"Hello world!"; hasher.input(data); // `input` can be called repeatedly and is generic over `AsRef<[u8]>` hasher.input("String data"); // Note that calling `finalize()` consumes hasher let hash = hasher.finalize(); println!("Result: {:x}", hash);
In this example hash
has type GenericArray<u8, U64>
, which is a generic alternative to [u8; 64]
.
Alternatively you can use chained approach, which is equivalent to the previous example:
let hash = Blake2b::new() .chain(b"Hello world!") .chain("String data") .finalize(); println!("Result: {:x}", hash);
If the whole message is available you also can use convinience digest
method:
let hash = Blake2b::digest(b"my message"); println!("Result: {:x}", hash);
Read
-able objectsIf you want to hash data from Read
trait (e.g. from file) you can rely on implementation of Write
trait (requires enabled-by-default std
feature):
use blake2::{Blake2b, Digest}; use std::{fs, io}; let mut file = fs::File::open(&path)?; let mut hasher = Blake2b::new(); let n = io::copy(&mut file, &mut hasher)?; let hash = hasher.finalize(); println!("Path: {}", path); println!("Bytes processed: {}", n); println!("Hash value: {:x}", hash);
You can write generic code over Digest
(or other traits from digest
crate) trait which will work over different hash functions:
use digest::Digest; // Toy example, do not use it in practice! // Instead use crates from: https://github.com/RustCrypto/password-hashing fn hash_password<D: Digest>(password: &str, salt: &str, output: &mut [u8]) { let mut hasher = D::new(); hasher.input(password.as_bytes()); hasher.input(b"$"); hasher.input(salt.as_bytes()); output.copy_from_slice(hasher.finalize().as_slice()) } use blake2::Blake2b; use sha2::Sha256; hash_password::<Blake2b>("my_password", "abcd", &mut buf); hash_password::<Sha256>("my_password", "abcd", &mut buf);
If you want to use hash functions with trait objects, use digest::DynDigest
trait.
Licensed under either of:
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.