25 releases
Uses new Rust 2024
0.11.0-pre.10 | Feb 22, 2025 |
---|---|
0.11.0-pre.9 | Jul 26, 2024 |
0.11.0-pre.8 | Feb 1, 2024 |
0.11.0-pre | Dec 19, 2022 |
0.3.0 |
|
#112 in Cryptography
14,121,938 downloads per month
Used in 27,633 crates
(831 directly)
115KB
2.5K
SLoC
RustCrypto: Digest Algorithm Traits
Traits which describe functionality of cryptographic hash functions, a.k.a. digest algorithms.
See RustCrypto/hashes for implementations which use this trait.
Usage
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.11"
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 Array<u8, U32>
, which is a generic
alternative to [u8; 32]
.
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);
Hashing Read
-able objects
If 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);
Generic code
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.
License
Licensed under either of:
at your option.
Contribution
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.
Dependencies
~395–600KB
~16K SLoC