使用旧的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 许可证的界定,应如上所述双重许可,没有任何附加条款或条件。