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等。

核心功能

  1. 伪随机函数生成
  2. 密钥派生功能
  3. 多算法支持
  4. 安全密钥管理

安装方法

在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(())
}

安全注意事项

  1. 始终使用密码学安全的随机数生成器
  2. 定期轮换密钥
  3. 妥善管理密钥材料
  4. 使用适当的盐值长度(至少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(())
}

这个库提供了企业级的密码学安全实现,适合在各种安全敏感的应用程序中使用。

回到顶部