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 Sha256 as an example.
First add the sha2
crate to your Cargo.toml
:
[dependencies] sha2 = "0.10"
sha2
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 sha2::{Sha256, Digest}; let mut hasher = Sha256::new(); let data = b"Hello world!"; hasher.update(data); // `input` can be called repeatedly and is generic over `AsRef<[u8]>` hasher.update("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 = Sha256::new() .chain_update(b"Hello world!") .chain_update("String data") .finalize(); println!("Result: {:x}", hash);
If the whole message is available you also can use convenience digest
method:
let hash = Sha256::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 sha2::{Sha256, Digest}; use std::{fs, io}; let mut file = fs::File::open(&path)?; let mut hasher = Sha256::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.update(password.as_bytes()); hasher.update(b"$"); hasher.update(salt.as_bytes()); output.copy_from_slice(hasher.finalize().as_slice()) } let mut buf1 = [0u8; 32]; let mut buf2 = [0u8; 64]; hash_password::<sha2::Sha256>("my_password", "abcd", &mut buf1); hash_password::<sha2::Sha512>("my_password", "abcd", &mut buf2);
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.