#已弃用 #哈希 #sha-2 #哈希 #算法 #sha-1 #md5

已弃用 ripemd256

已弃用。请使用 ripemd 包代替。

2 个不稳定版本

0.2.0 2022年2月5日
0.1.0 2021年5月25日

#40#md5

Download history 375/week @ 2024-04-02 158/week @ 2024-04-09 245/week @ 2024-04-16 381/week @ 2024-04-23 467/week @ 2024-04-30 309/week @ 2024-05-07 350/week @ 2024-05-14 212/week @ 2024-05-21 192/week @ 2024-05-28 220/week @ 2024-06-04 205/week @ 2024-06-11 397/week @ 2024-06-18 187/week @ 2024-06-25 210/week @ 2024-07-02 194/week @ 2024-07-09 302/week @ 2024-07-16

每月 975 次下载
rshash 中使用

MIT/Apache

1KB

RustCrypto: 哈希函数

Project Chat dependency status Apache2/MIT licensed

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

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

支持算法

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

算法 Crates.io 文档 MSRV 安全性
Ascon 哈希 ascon-hash crates.io Documentation MSRV 1.71 💚
BelT 哈希 belt-hash crates.io Documentation MSRV 1.71 💚
BLAKE2 blake2 crates.io Documentation MSRV 1.71 💚
FSB fsb crates.io Documentation MSRV 1.71 💚
GOST R 34.11-94 gost94 crates.io Documentation MSRV 1.71 💛
Grøstl (Groestl) groestl crates.io Documentation MSRV 1.71 💚
JH jh crates.io Documentation MSRV 1.71 💚
KangarooTwelve k12 crates.io Documentation MSRV 1.71 💚
MD2 md2 crates.io Documentation MSRV 1.71 💔
MD4 md4 crates.io Documentation MSRV 1.71 💔
MD5 md5 crates.io Documentation MSRV 1.72 💔
RIPEMD ripemd crates.io Documentation MSRV 1.71 💚
SHA-1 sha1 crates.io Documentation MSRV 1.72 💔
SHA-1 Checked sha1-checked crates.io Documentation MSRV 1.72 💛
SHA-2 sha2 crates.io Documentation MSRV 1.72 💚
SHA-3 (Keccak) sha3 crates.io Documentation MSRV 1.71 💚
SHABAL shabal crates.io Documentation MSRV 1.71 💚
Skein skein crates.io Documentation MSRV 1.71 💚
SM3 (OSCCA GM/T 0004-2012) sm3 crates.io Documentation MSRV 1.71 💚
Streebog (GOST R 34.11-2012) streebog crates.io Documentation MSRV 1.71 💛
Tiger tiger crates.io Documentation MSRV 1.74 💚
Whirlpool whirlpool crates.io Documentation MSRV 1.71 💚

注意:blake3 包实现了该存储库中其余哈希使用的 digest 特质,但由 BLAKE3 团队维护。

安全级别图例

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

心形 描述
💚 没有已知的成功攻击
💛 理论突破:安全性低于声明的水平
💔 实际操作中演示的攻击:尽可能避免

有关更多信息,请参阅维基百科上的安全页面。

存储库名称

尽可能情况下,存储库将使用与存储库文件夹相同的名称进行发布。`md5`存储库的所有者拒绝参与此项目。此存储库不实现digest特质,因此它与RustCrypto生态系统不兼容。这就是为什么我们将我们的MD5实现发布为md-5,并用❗标记。请注意,库本身命名为md5,即在use语句中,您应该使用md5,而不是md_5

SHA-1实现以前以sha-1发布,但自v0.10.0版本以来已迁移到sha1。`sha-1`将继续接收v0.10.x补丁更新,但在sha1 v0.11版本发布后将弃用。

最低支持的Rust版本(MSRV)策略

MSRV提升被视为破坏性更改,并且仅在进行次要版本提升时执行。

示例

让我们以SHA-2为例,展示如何使用此存储库中的存储库。

首先将sha2存储库添加到您的Cargo.toml

[dependencies]
sha2 = "0.10"

请注意,此存储库中的所有存储库都具有默认启用的std功能。因此,如果您计划在no_std环境中使用存储库,请不要忘记禁用它。

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2和其他哈希实现存储库为了方便起见重新导出digest存储库和Digest特质,因此您不需要将其作为显式依赖项包含在您的Cargo.toml中。

现在您可以编写以下代码

use sha2::{Sha256, Digest};

let mut hasher = Sha256::new();
let data = b"Hello world!";
hasher.update(data);
// `update` 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!("Binary hash: {:?}", hash);

在此示例中,hash的类型为GenericArray<u8, U32>,这是在generic-array存储库中定义的[u8; 32]的泛型替代品。如果您需要将哈希值序列化为字符串,可以使用类似base16ctbase64ct的存储库。

use base64ct::{Base64, Encoding};

let base64_hash = Base64::encode_string(&hash);
println!("Base64-encoded hash: {}", base64_hash);

let hex_hash = base16ct::lower::encode_string(&hash);
println!("Hex-encoded hash: {}", hex_hash);

除了调用update之外,您还可以使用链式方法

use sha2::{Sha256, Digest};

let hash = Sha256::new()
    .chain_update(b"Hello world!")
    .chain_update("String data")
    .finalize();

如果有一个完整的信息,您可以使用便利的Digest::digest方法

use sha2::{Sha256, Digest};

let hash = Sha256::digest(b"my message");

哈希可读对象

如果您想从实现Read特质的类型中哈希数据,则可以依赖于Write特质的实现(需要默认启用的std功能)

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();

基于哈希的消息认证码(HMAC)

如果您想计算基于哈希的消息认证码(HMAC),可以使用来自基于哈希的消息认证码(HMAC)的通用实现,该实现来自hmac存储库,该存储库是RustCrypto/MACs仓库的一部分。

通用代码

您可以在Digest特质(或digest存储库中的其他特质)上编写通用代码,它将适用于不同的哈希函数。

use sha2::{Sha256, Sha512, 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())
}

let mut buf1 = [0u8; 32];
hash_password::<Sha256>("my_password", "abcd", &mut buf1);

let mut buf2 = [0u8; 64];
hash_password::<Sha512>("my_password", "abcd", &mut buf2);

如果您想使用特质对象作为哈希函数,可以使用DynDigest特质。

use digest::DynDigest;

// Dynamic hash function
fn use_hasher(hasher: &mut dyn DynDigest, data: &[u8]) -> Box<[u8]> {
    hasher.update(data);
    hasher.finalize_reset()
}

// You can use something like this when parsing user input, CLI arguments, etc.
// DynDigest needs to be boxed here, since function return should be sized.
fn select_hasher(s: &str) -> Box<dyn DynDigest> {
    match s {
        "md5" => Box::new(md5::Md5::default()),
        "sha1" => Box::new(sha1::Sha1::default()),
        "sha224" => Box::new(sha2::Sha224::default()),
        "sha256" => Box::new(sha2::Sha256::default()),
        "sha384" => Box::new(sha2::Sha384::default()),
        "sha512" => Box::new(sha2::Sha512::default()),
        _ => unimplemented!("unsupported digest: {}", s),
    }
}

let mut hasher1 = select_hasher("md5");
let mut hasher2 = select_hasher("sha512");

// the `&mut *hasher` is to DerefMut the value out of the Box
// this is equivalent to `DerefMut::deref_mut(&mut hasher)`

// can be reused due to `finalize_reset()`
let hash1_1 = use_hasher(&mut *hasher1, b"foo");
let hash1_2 = use_hasher(&mut *hasher1, b"bar");
let hash2_1 = use_hasher(&mut *hasher2, b"foo");

许可协议

本存储库中的所有存储库均受以下任一许可协议的许可:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可协议定义的,您提交的任何有意包含在本作品中的贡献,应按上述方式双许可,不附加任何额外条款或条件。

无运行时依赖