#密钥派生 #KDF #扩展 #哈希 # #输出

无std hkdf

基于HMAC的提取和扩展密钥派生函数(HKDF)

25个不稳定版本

0.13.0-pre.42024年7月26日
0.13.0-pre.32024年2月1日
0.13.0-pre.22024年1月17日
0.12.4 2023年12月13日
0.1.0 2015年1月3日

#10 in 加密学

Download history 551869/week @ 2024-04-25 564599/week @ 2024-05-02 572915/week @ 2024-05-09 647893/week @ 2024-05-16 616675/week @ 2024-05-23 636847/week @ 2024-05-30 624199/week @ 2024-06-06 630644/week @ 2024-06-13 612431/week @ 2024-06-20 619033/week @ 2024-06-27 572942/week @ 2024-07-04 580064/week @ 2024-07-11 599116/week @ 2024-07-18 622686/week @ 2024-07-25 598932/week @ 2024-08-01 533000/week @ 2024-08-08

2,465,512 每月下载量
用于 2,018 个crate(192个直接使用)

MIT/Apache

175KB
218

RustCrypto: HKDF

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

通用的基于哈希函数的纯Rust实现HMAC-based Extract-and-Expand Key Derivation Function (HKDF)

使用方法

使用HKDF最常见的方法如下:你提供初始密钥材料(IKM)和一个可选的盐,然后将其扩展(可能多次)为一些与“info”上下文字符串绑定的输出密钥材料(OKM)。

use sha2::Sha256;
use hkdf::Hkdf;
use hex_literal::hex;

let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
let salt = hex!("000102030405060708090a0b0c");
let info = hex!("f0f1f2f3f4f5f6f7f8f9");

let hk = Hkdf::<Sha256>::new(Some(&salt[..]), &ikm);
let mut okm = [0u8; 42];
hk.expand(&info, &mut okm)
    .expect("42 is a valid length for Sha256 to output");

let expected = hex!("
    3cb25f25faacd57a90434f64d0362f2a
    2d2d0a90cf1a5a4c5db02d56ecc4c5bf
    34007208d5b887185865
");
assert_eq!(okm, expected);

通常PRK(伪随机密钥)在HKDF对象中保持隐藏,但如果你需要访问它,请使用Hkdf::extract而不是Hkdf::new

let (prk, hk) = Hkdf::<Sha256>::extract(Some(&salt[..]), &ikm);
let expected = hex!("
    077709362c2e32df0ddc3f0dc47bba63
    90b6c73bb50f9c3122ec844ad7c2b3e5
");
assert_eq!(prk[..], expected[..]);

如果你已经有了一个可以工作的强密钥(均匀分布且足够长),你可以通过跳过提取步骤来节省一点时间。在这种情况下,你将伪随机密钥(PRK)传递给Hkdf::from_prk构造函数,然后像通常一样使用生成的Hkdf对象。

let prk = hex!("
    077709362c2e32df0ddc3f0dc47bba63
    90b6c73bb50f9c3122ec844ad7c2b3e5
");

let hk = Hkdf::<Sha256>::from_prk(&prk).expect("PRK should be large enough");
let mut okm = [0u8; 42];
hk.expand(&info, &mut okm)
    .expect("42 is a valid length for Sha256 to output");

let expected = hex!("
    3cb25f25faacd57a90434f64d0362f2a
    2d2d0a90cf1a5a4c5db02d56ecc4c5bf
    34007208d5b887185865
");
assert_eq!(okm, expected);

最低支持的Rust版本

Rust 1.72 或更高。

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

SemVer策略

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

许可证

根据您选择的以下许可证之一授权

任选。

贡献

除非您明确声明,否则您提交给作品以供包含的所有有意贡献,根据Apache-2.0许可证定义,均将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~365–530KB
~11K SLoC