使用旧的Rust 2015
| 0.8.1 |
|
|---|
#38 在 #sha-3
520KB
242 行
RustCrypto 哈希 
纯Rust编写的加密哈希函数集合。
所有算法都位于单独的crates中,并使用来自digest crate的特质实现。此外,所有crates都不需要标准库(即no_std capable),可以轻松用于裸机或WebAssembly编程。
支持算法
注意:对于新应用,或与其他现有标准兼容性不是主要关注点的情况,我们强烈建议使用BLAKE2、SHA-2或SHA-3。
| 名称 | 别名 | Crates.io | 文档 | 安全级别 |
|---|---|---|---|---|
| BLAKE2 | 💚 | |||
| GOST94 | GOST R 34.11-94 | 💛 | ||
| Grøstl | Groestl | 💚 | ||
| MD2 | 💔 | |||
| MD4 | 💔 | |||
| MD5 ❗ | 💔 | |||
| RIPEMD-160 | 💚 | |||
| SHA-1 ❗ | 💔 | |||
| SHA-2 | 💚 | |||
| SHA-3 | Keccak | 💚 | ||
| Streebog | GOST R 34.11-2012 | 💛 | ||
| Whirlpool | 💚 |
安全级别图例
以下描述了与每个哈希函数(即算法,而非特定实现)相关的安全级别评分
| 心形 | 描述 |
|---|---|
| 💚 | 没有已知的成功攻击 |
| 💛 | 理论破解:安全性低于声称的水平 |
| 💔 | 实践中已展示攻击:尽可能避免 |
最低支持Rust版本(MSRV)
此存储库中的所有crates都支持Rust 1.21或更高版本。在未来的最低支持Rust版本可能会更改,但将以较小版本号的方式更改。
crates名称
尽可能情况下,crates将以与crates文件夹相同的名称发布。md5和sha1 crates的所有者拒绝(1,2)参与此项目。这就是为什么标记有❗的crates分别以md-5和sha-1名称发布的原因。
使用方法
让我们以BLAKE2b为例,演示如何使用此存储库中的crates。
首先将 blake2 链接库添加到您的 Cargo.toml
[dependencies]
blake2 = "0.8"
blake2 和其他链接库为了方便起见会重新导出 digest 链接库和 Digest 特性,因此您不需要将 digest 链接库作为显式依赖项添加。
现在您可以编写以下代码
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 `result()` consumes hasher
let hash = hasher.result();
println!("Result: {:x}", hash);
在这个例子中 hash 具有类型 GenericArray<u8, U64>,这是 [u8; 64] 的泛型替代。
或者,您可以使用链式方法,这与前面的例子等效
let hash = Blake2b::new()
.chain(b"Hello world!")
.chain("String data")
.result();
println!("Result: {:x}", hash);
如果整个消息都可用,您也可以使用方便的 digest 方法
let hash = Blake2b::digest(b"my message");
println!("Result: {:x}", hash);
哈希可读对象
如果您想从 Read 特性(例如文件)中哈希数据,您可以根据 Write 特性的实现(需要启用默认的 std 功能)来依赖。
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.result();
println!("Path: {}", path);
println!("Bytes processed: {}", n);
println!("Hash value: {:x}", hash);
基于哈希的消息认证码 (HMAC)
如果您想计算 基于哈希的消息认证码 (HMAC),您可以使用 hmac 链接库中的泛型实现,该链接库是 RustCrypto/MACs 存储库的一部分。
泛型代码
您可以在 Digest(或来自 digest 链接库的其他特性)特性上编写泛型代码,该代码将在不同的哈希函数上工作
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.result().as_slice())
}
use blake2::Blake2b;
use sha2::Sha256;
hash_password::<Blake2b>("my_password", "abcd", &mut buf);
hash_password::<Sha256>("my_password", "abcd", &mut buf);
如果您想使用特性对象作为哈希函数,请使用 digest::DynDigest 特性。
许可证
所有链接库均受以下任一许可证的许可
由您选择。
贡献
除非您明确声明,否则任何有意提交给您的工作以包含在内的贡献,根据 Apache-2.0 许可证的界定,应如上所述双重许可,没有任何附加条款或条件。