#消息认证 #哈希 #加密

无std digest

密码哈希函数和消息认证码的特质

24个版本

0.11.0-pre.92024年7月26日
0.11.0-pre.82024年2月1日
0.11.0-pre.72024年1月17日
0.11.0-pre2022年12月19日
0.3.0 2016年11月17日

#77密码学

Download history 2028281/week @ 2024-05-03 2113905/week @ 2024-05-10 2130748/week @ 2024-05-17 2055255/week @ 2024-05-24 2235694/week @ 2024-05-31 2188062/week @ 2024-06-07 2171430/week @ 2024-06-14 2207783/week @ 2024-06-21 2030064/week @ 2024-06-28 2133477/week @ 2024-07-05 2213255/week @ 2024-07-12 2278094/week @ 2024-07-19 2279371/week @ 2024-07-26 2335617/week @ 2024-08-02 2444627/week @ 2024-08-09 2327835/week @ 2024-08-16

9,817,562 每月下载
用于 23,257 个crate(754直接使用)

MIT/Apache

110KB
2.5K SLoC

RustCrypto: 密码摘要算法特质

crate Docs Apache2/MIT licensed Rust Version Project Chat Build Status

描述密码哈希函数(也称为摘要算法)功能的特质。

有关使用此特质的实现,请参阅RustCrypto/hashes

文档

最低支持的Rust版本

Rust 1.71 或更高。

最低支持的Rust版本将来可能会更改,但将以小版本号的增加来完成。

SemVer策略

  • 此库的所有默认功能均受SemVer保护
  • 如上所述,MSRV被视为免于SemVer

用法

让我们以Sha256为例,演示如何使用此仓库中的crate。

首先将sha2 crate添加到您的Cargo.toml

[dependencies]
sha2 = "0.11"

sha2和其他crate重新导出digest crate和Digest特质以方便使用,因此您无需将digest crate作为显式依赖项添加。

现在您可以编写以下代码

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

在此示例中,hash具有类型Array<u8, U64>,这是[u8; 64]的泛型替代品。

或者,您可以使用链式方法,这与上一个示例等价

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

println!("Result: {:x}", hash);

如果整个消息可用,您还可以使用便利的digest方法

let hash = Sha256::digest(b"my message");
println!("Result: {:x}", hash);

哈希可读对象

如果您想从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();

println!("Path: {}", path);
println!("Bytes processed: {}", n);
println!("Hash value: {:x}", hash);

泛型代码

您可以在Digest(或来自digest crate的其他特质)特质上编写泛型代码,该代码适用于不同的哈希函数

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

如果您想使用具有特征对象的哈希函数,请使用 digest::DynDigest 特征。

许可协议

以下任一许可协议下:

任选其一。

贡献

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

依赖项

~185–445KB
~10K SLoC