Rust加密库tink-prf的使用:安全伪随机函数生成与密钥派生功能实现
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 初始化tink-prf库
tink_prf::init();
// 创建HMAC-SHA256 PRF密钥句柄
let kh = tink_core::keyset::Handle::new(&tink_prf::hmac_sha256_prf_key_template())?;
// 创建PRF集合
let m = tink_prf::Set::new(&kh)?;
// 输入数据
let pt = b"need pseudo-random data deterministically produced from this input";
// 计算PRF输出,生成16字节的伪随机数据
let out = m.compute_primary_prf(pt, 16)?;
// 打印结果
println!("'{}' => {}", String::from_utf8_lossy(pt), hex::encode(&out));
// 验证输出长度
assert_eq!(out.len(), 16);
Ok(())
}
完整示例代码:
use std::error::Error;
use hex;
fn main() -> Result<(), Box<dyn Error>> {
// 初始化tink-prf密码学库
tink_prf::init();
// 使用HMAC-SHA256算法创建PRF密钥模板
// 生成密钥句柄用于后续操作
let kh = tink_core::keyset::Handle::new(&tink_prf::hmac_sha256_prf_key_template())?;
// 创建PRF集合实例,封装密钥功能
let prf_set = tink_prf::Set::new(&kh)?;
// 定义输入数据,将用于生成伪随机输出
let input_data = b"需要从此输入确定性生成伪随机数据";
// 计算主PRF函数,生成指定长度的输出
// 第二个参数16表示需要16字节的输出
let random_output = prf_set.compute_primary_prf(input_data, 16)?;
// 显示输入和对应的十六进制输出
println!("输入: '{}'", String::from_utf8_lossy(input_data));
println!("PRF输出(十六进制): {}", hex::encode(&random_output));
println!("输出长度: {} 字节", random_output.len());
// 验证输出长度是否符合预期
assert_eq!(random_output.len(), 16);
// 密钥派生功能示例
// 可以使用PRF输出作为密钥派生函数的输入
let derived_key = prf_set.compute_primary_prf(input_data, 32)?;
println!("派生密钥(32字节): {}", hex::encode(&derived_key));
Ok(())
}
此crate提供伪随机函数(PRF)功能,如上游Tink文档中所述。
Apache License, Version 2.0
这不是官方支持的Google产品。
1 回复
Rust加密库tink-prf的使用:安全伪随机函数生成与密钥派生功能实现
概述
tink-prf是Google Tink加密库的Rust实现,专注于提供安全可靠的伪随机函数(PRF)和密钥派生功能。该库基于现代密码学标准,支持多种PRF算法,包括HMAC-SHA256、AES-CMAC和HKDF等。
核心功能
- 伪随机函数生成
- 密钥派生功能
- 多算法支持
- 安全密钥管理
安装方法
在Cargo.toml中添加依赖:
[dependencies]
tink-prf = "0.3"
基本使用方法
1. 使用HMAC-SHA256 PRF
use tink_prf::{PrfSet, HmacPrfKeyManager};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 初始化PRF密钥管理器
tink_prf::init();
// 生成HMAC-SHA256密钥
let key_template = tink_prf::hmac_sha256_prf_key_template();
let key_handle = tink_core::keyset::Handle::new(&key_template)?;
// 获取PRF实例
let prf_set = key_handle.get_prf_set()?;
let prf = prf_set.primary_prf()?;
// 生成伪随机输出
let input_data = b"example input";
let output = prf.compute_prf(input_data, 32)?;
println!("Generated PRF output: {:?}", output);
Ok(())
}
2. 使用HKDF进行密钥派生
use tink_prf::{PrfSet, HkdfPrfKeyManager};
fn hkdf_example() -> Result<(), Box<dyn std::error::Error>> {
tink_prf::init();
// 创建HKDF密钥模板
let key_template = tink_prf::hkdf_sha256_prf_key_template();
let key_handle = tink_core::keyset::Handle::new(&key_template)?;
let prf_set = key_handle.get_prf_set()?;
let hkdf_prf = prf_set.primary_prf()?;
// 使用盐值和输入数据进行密钥派生
let salt = b"unique-salt";
let info = b"application-context";
let input = [salt, info].concat();
let derived_key = hkdf_prf.compute_prf(&input, 32)?;
println!("Derived key: {:?}", derived_key);
Ok(())
}
3. 多PRF支持示例
use tink_prf::{PrfSet, PrfKeyTemplate};
fn multi_prf_example() -> Result<(), Box<dyn std::error::Error>> {
tink_prf::init();
// 支持的不同PRF算法模板
let algorithms = [
("HMAC-SHA256", tink_prf::hmac_sha256_prf_key_template()),
("HMAC-SHA512", tink_prf::hmac_sha512_prf_key_template()),
("AES-CMAC", tink_prf::aes_cmac_prf_key_template()),
];
for (name, template) in algorithms.iter() {
let key_handle = tink_core::keyset::Handle::new(template)?;
let prf_set = key_handle.get_prf_set()?;
let prf = prf_set.primary_prf()?;
let output = prf.compute_prf(b"test input", 16)?;
println!("{} output: {:?}", name, output);
}
Ok(())
}
高级功能
自定义输出长度
fn variable_length_prf() -> Result<(), Box<dyn std::error::Error>> {
tink_prf::init();
let key_handle = tink_core::keyset::Handle::new(
&tink_prf::hmac_sha256_prf_key_template()
)?;
let prf = key_handle.get_prf_set()?.primary_prf()?;
// 生成不同长度的输出
let lengths = [16, 32, 64, 128];
for &len in lengths.iter() {
let output = prf.compute_prf(b"input data", len)?;
println!("Length {}: {:?}", len, output);
}
Ok(())
}
安全注意事项
- 始终使用密码学安全的随机数生成器
- 定期轮换密钥
- 妥善管理密钥材料
- 使用适当的盐值长度(至少128位)
错误处理
fn error_handling_example() -> Result<(), Box<dyn std::error::Error>> {
tink_prf::init();
match tink_core::keyset::Handle::new(
&tink_prf::hmac_sha256_prf_key_template()
) {
Ok(handle) => {
let prf = handle.get_prf_set()?.primary_prf()?;
let result = prf.compute_prf(b"input", 32)?;
println!("Success: {:?}", result);
}
Err(e) => eprintln!("Key generation failed: {}", e),
}
Ok(())
}
完整示例代码
use tink_prf::{PrfSet, HmacPrfKeyManager, HkdfPrfKeyManager, PrfKeyTemplate};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 初始化tink-prf库
tink_prf::init();
println!("=== HMAC-SHA256 PRF示例 ===");
hmac_sha256_example()?;
println!("\n=== HKDF密钥派生示例 ===");
hkdf_derivation_example()?;
println!("\n=== 多算法PRF支持示例 ===");
multi_algorithm_example()?;
println!("\n=== 可变长度输出示例 ===");
variable_length_example()?;
Ok(())
}
/// HMAC-SHA256 PRF示例
fn hmac_sha256_example() -> Result<(), Box<dyn std::error::Error>> {
// 生成HMAC-SHA256密钥模板
let key_template = tink_prf::hmac_sha256_prf_key_template();
let key_handle = tink_core::keyset::Handle::new(&key_template)?;
// 获取PRF实例
let prf_set = key_handle.get_prf_set()?;
let prf = prf_set.primary_prf()?;
// 生成32字节的伪随机输出
let input_data = b"example input data for PRF";
let output = prf.compute_prf(input_data, 32)?;
println!("输入数据: {:?}", input_data);
println!("PRF输出 (32字节): {:?}", output);
println!("输出长度: {} 字节", output.len());
Ok(())
}
/// HKDF密钥派生示例
fn hkdf_derivation_example() -> Result<(), Box<dyn std::error::Error>> {
// 创建HKDF-SHA256密钥模板
let key_template = tink_prf::hkdf_sha256_prf_key_template();
let key_handle = tink_core::keyset::Handle::new(&key_template)?;
let prf_set = key_handle.get_prf_set()?;
let hkdf_prf = prf_set.primary_prf()?;
// 准备派生参数
let salt = b"unique-cryptographic-salt"; // 加密盐值
let info = b"my-application-key-derivation"; // 应用上下文信息
let input = [salt, info].concat(); // 组合盐值和信息
// 派生32字节的密钥
let derived_key = hkdf_prf.compute_prf(&input, 32)?;
println!("盐值: {:?}", salt);
println!("上下文信息: {:?}", info);
println!("派生密钥: {:?}", derived_key);
println!("密钥长度: {} 字节", derived_key.len());
Ok(())
}
/// 多算法支持示例
fn multi_algorithm_example() -> Result<(), Box<dyn std::error::Error>> {
// 支持的PRF算法列表
let algorithms = [
("HMAC-SHA256", tink_prf::hmac_sha256_prf_key_template()),
("HMAC-SHA512", tink_prf::hmac_sha512_prf_key_template()),
("AES-CMAC", tink_prf::aes_cmac_prf_key_template()),
];
let test_input = b"standard test input for comparison";
for (name, template) in algorithms.iter() {
println!("\n--- {} ---", name);
let key_handle = tink_core::keyset::Handle::new(template)?;
let prf_set = key_handle.get_prf_set()?;
let prf = prf_set.primary_prf()?;
// 生成16字节输出用于比较
let output = prf.compute_prf(test_input, 16)?;
println!("输入: {:?}", test_input);
println!("输出: {:?}", output);
println!("输出长度: {} 字节", output.len());
}
Ok(())
}
/// 可变长度输出示例
fn variable_length_example() -> Result<(), Box<dyn std::error::Error>> {
let key_handle = tink_core::keyset::Handle::new(
&tink_prf::hmac_sha256_prf_key_template()
)?;
let prf = key_handle.get_prf_set()?.primary_prf()?;
let input_data = b"input for variable length output";
let lengths = [16, 24, 32, 48, 64]; // 不同的输出长度
println!("输入数据: {:?}", input_data);
for &len in lengths.iter() {
let output = prf.compute_prf(input_data, len)?;
println!("长度 {} 字节: {:?}... (前16字节)", len, &output[..16.min(output.len())]);
}
Ok(())
}
/// 错误处理示例
fn demonstrate_error_handling() -> Result<(), Box<dyn std::error::Error>> {
println!("\n=== 错误处理示例 ===");
match tink_core::keyset::Handle::new(
&tink_prf::hmac_sha256_prf_key_template()
) {
Ok(handle) => {
match handle.get_prf_set() {
Ok(prf_set) => {
match prf_set.primary_prf() {
Ok(prf) => {
match prf.compute_prf(b"test input", 32) {
Ok(result) => {
println!("操作成功: 生成 {} 字节PRF输出", result.len());
}
Err(e) => eprintln!("PRF计算失败: {}", e),
}
}
Err(e) => eprintln!("获取PRF实例失败: {}", e),
}
}
Err(e) => eprintln!("获取PRF集合失败: {}", e),
}
}
Err(e) => eprintln!("密钥生成失败: {}", e),
}
Ok(())
}
这个库提供了企业级的密码学安全实现,适合在各种安全敏感的应用程序中使用。