Crates.io | digest |
lib.rs | digest |
version | 0.11.0-pre.9 |
source | src |
created_at | 2016-10-06 14:10:33.76349 |
updated_at | 2024-07-26 20:00:26.563816 |
description | Traits for cryptographic hash functions and message authentication codes |
homepage | |
repository | https://github.com/RustCrypto/traits |
max_upload_size | |
id | 6736 |
size | 100,273 |
Traits which describe functionality of cryptographic hash functions, a.k.a. digest algorithms.
See RustCrypto/hashes for implementations which use this trait.
Rust 1.71 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.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, 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.