#摘要 #哈希 #Keccak #sha-3 #加密

已删除 sha3-plus

SHA-3 (Keccak) 哈希函数,具有CryptoNight使用的额外功能

使用旧的Rust 2015

0.8.1 2018年10月22日

#38#sha-3

MIT/Apache

520KB
242

RustCrypto 哈希 构建状态

纯Rust编写的加密哈希函数集合。

所有算法都位于单独的crates中,并使用来自digest crate的特质实现。此外,所有crates都不需要标准库(即no_std capable),可以轻松用于裸机或WebAssembly编程。

支持算法

注意:对于新应用,或与其他现有标准兼容性不是主要关注点的情况,我们强烈建议使用BLAKE2、SHA-2或SHA-3。

名称 别名 Crates.io 文档 安全级别
BLAKE2 crates.io Documentation 💚
GOST94 GOST R 34.11-94 crates.io Documentation 💛
Grøstl Groestl crates.io Documentation 💚
MD2 crates.io Documentation 💔
MD4 crates.io Documentation 💔
MD5 crates.io Documentation 💔
RIPEMD-160 crates.io Documentation 💚
SHA-1 crates.io Documentation 💔
SHA-2 crates.io Documentation 💚
SHA-3 Keccak crates.io Documentation 💚
Streebog GOST R 34.11-2012 crates.io Documentation 💛
Whirlpool crates.io Documentation 💚

安全级别图例

以下描述了与每个哈希函数(即算法,而非特定实现)相关的安全级别评分

心形 描述
💚 没有已知的成功攻击
💛 理论破解:安全性低于声称的水平
💔 实践中已展示攻击:尽可能避免

最低支持Rust版本(MSRV)

此存储库中的所有crates都支持Rust 1.21或更高版本。在未来的最低支持Rust版本可能会更改,但将以较小版本号的方式更改。

crates名称

尽可能情况下,crates将以与crates文件夹相同的名称发布。md5sha1 crates的所有者拒绝(12)参与此项目。这就是为什么标记有❗的crates分别以md-5sha-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 许可证的界定,应如上所述双重许可,没有任何附加条款或条件。

依赖项