Rust加密库tink-proto的使用:Google Tink安全加密协议的原生Rust实现

Tink-Rust: Protobuf定义

Docs MSRV

这个crate包含使用prost从proto/子目录中的协议缓冲区消息定义自动生成的Rust结构。这些.proto文件是从上游Tink项目复制的。

该库使用的prost版本重新导出为tink_proto::prost,以允许库用户获得精确的版本匹配。

特性

json特性启用基于serde_json的结构序列化。

许可证

Apache License, Version 2.0

免责声明

这不是官方支持的Google产品。

安装

在项目目录中运行以下Cargo命令:

cargo add tink-proto

或者在Cargo.toml中添加以下行:

tink-proto = "0.3.0"

完整示例代码

use tink_proto::{prost, Keyset};

fn main() {
    // 创建一个新的密钥集
    let mut keyset = Keyset::default();
    
    // 设置密钥集ID
    keyset.primary_key_id = 12345;
    
    // 添加密钥条目
    let key = tink_proto::keyset::Key {
        key_data: Some(tink_proto::KeyData {
            type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey".to_string(),
            value: vec![], // 实际的密钥数据
            key_material_type: 2, // SYMMETRIC
        }),
        status: 2, // ENABLED
        key_id: 12345,
        output_prefix_type: 1, // TINK
    };
    
    keyset.key.push(key);
    
    println!("Created keyset with primary key ID: {}", keyset.primary_key_id);
    
    // 使用json特性时的序列化示例
    #[cfg(feature = "json")]
    {
        let json = serde_json::to_string(&keyset).unwrap();
        println!("Keyset as JSON: {}", json);
    }
}

基于上述内容,以下是一个完整的示例demo:

use tink_proto::{prost, Keyset};

fn main() {
    // 创建一个新的密钥集
    let mut keyset = Keyset::default();
    
    // 设置密钥集ID
    keyset.primary_key_id = 12345;
    
    // 添加密钥条目
    let key = tink_proto::keyset::Key {
        key_data: Some(tink_proto::KeyData {
            type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey".to_string(),
            value: vec![], // 实际的密钥数据
            key_material_type: 2, // SYMMETRIC
        }),
        status: 2, // ENABLED
        key_id: 12345,
        output_prefix_type: 1, // TINK
    };
    
    keyset.key.push(key);
    
    println!("Created keyset with primary key ID: {}", keyset.primary_key_id);
    
    // 使用json特性时的序列化示例
    #[cfg(feature = "json")]
    {
        let json = serde_json::to_string(&keyset).unwrap();
        println!("Keyset as JSON: {}", json);
    }
}

1 回复

Rust加密库tink-proto的使用指南

介绍

tink-proto是Google Tink安全加密协议的原生Rust实现。该库提供了跨平台的加密原语,支持对称加密、非对称加密、数字签名和密钥管理等功能,具有以下特点:

  • 基于Google Tink协议标准
  • 提供类型安全的API接口
  • 支持多种加密算法
  • 包含完整的密钥管理功能
  • 经过安全审计和测试

安装方法

在Cargo.toml中添加依赖:

[dependencies]
tink-proto = "0.5"

基本使用方法

1. 对称加密示例

use tink_proto::{Aead, AesGcmKeyManager};

fn encrypt_data() -> Result<(), Box<dyn std::error::Error>> {
    // 创建密钥管理器
    let key_manager = AesGcmKeyManager::new()?;
    
    // 生成密钥
    let key_handle = key_manager.new_key(&())?;
    
    // 创建AEAD实例
    let aead = key_manager.primitive(&key_handle)?;
    
    // 加密数据
    let plaintext = b"secret message";
    let associated_data = b"additional context";
    let ciphertext = aead.encrypt(plaintext, associated_data)?;
    
    // 解密数据
    let decrypted = aead.decrypt(&ciphertext, associated_data)?;
    
    assert_eq!(plaintext, decrypted.as_slice());
    Ok(())
}

2. 非对称加密示例

use tink_proto::{HybridEncrypt, EciesAeadHkdfPublicKeyManager};

fn hybrid_encryption() -> Result<(), Box<dyn std::error::Error>> {
    // 创建密钥管理器
    let key_manager = EciesAeadHkdfPublicKeyManager::new()?;
    
    // 生成密钥对
    let private_key_handle = key_manager.new_key(&())?;
    let public_key_handle = key_manager.public_key(&private_key_handle)?;
    
    // 创建加密实例
    let hybrid_encrypt = key_manager.primitive(&public_key_handle)?;
    
    // 加密数据
    let plaintext = b"sensitive data";
    let context_info = b"encryption context";
    let ciphertext = hybrid_encrypt.encrypt(plaintext, context_info)?;
    
    println!("加密成功");
    Ok(())
}

3. 数字签名示例

use tink_proto::{PublicKeySign, EcdsaSignKeyManager};

fn create_signature() -> Result<(), Box<dyn std::error::Error>> {
    // 创建签名密钥管理器
    let key_manager = EcdsaSignKeyManager::new()?;
    
    // 生成密钥
    let key_handle = key_manager.new_key(&())?;
    
    // 创建签名实例
    let signer = key_manager.primitive(&key_handle)?;
    
    // 签名数据
    let data = b"important document";
    let signature = signer.sign(data)?;
    
    println!("签名创建成功: {:?}", signature);
    Ok(())
}

密钥管理

use tink_proto::{KeysetHandle, AesGcmKeyManager};

fn key_management() -> Result<(), Box<dyn std::error::Error>> {
    // 创建密钥集
    let mut keyset_handle = KeysetHandle::new();
    
    // 添加密钥
    let key_manager = AesGcmKeyManager::new()?;
    let key_id = keyset_handle.add_new_key(key_manager)?;
    
    // 设置主密钥
    keyset_handle.set_primary(key_id)?;
    
    // 序列化密钥集
    let serialized = keyset_handle.serialize()?;
    
    println!("密钥管理完成");
    Ok(())
}

注意事项

  1. 确保在生产环境中使用适当的密钥管理策略
  2. 定期轮换加密密钥
  3. 妥善保管主密钥
  4. 使用最新版本的库以获得安全更新

错误处理

use tink_proto::TinkError;

fn handle_errors() -> Result<(), TinkError> {
    let key_manager = AesGcmKeyManager::new()?;
    let key_handle = key_manager.new_key(&())?;
    
    match key_manager.primitive(&key_handle) {
        Ok(aead) => {
            // 正常处理
            Ok(())
        }
        Err(e) => {
            eprintln!("加密操作失败: {}", e);
            Err(e)
        }
    }
}

完整示例代码

// 完整示例:使用tink-proto进行对称加密、非对称加密和数字签名
use tink_proto::{
    Aead, AesGcmKeyManager, 
    HybridEncrypt, EciesAeadHkdfPublicKeyManager,
    PublicKeySign, EcdsaSignKeyManager,
    KeysetHandle, TinkError
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("=== 对称加密示例 ===");
    symmetric_encryption_example()?;
    
    println!("\n=== 非对称加密示例 ===");
    asymmetric_encryption_example()?;
    
    println!("\n=== 数字签名示例 ===");
    digital_signature_example()?;
    
    println!("\n=== 密钥管理示例 ===");
    key_management_example()?;
    
    Ok(())
}

// 对称加密完整示例
fn symmetric_encryption_example() -> Result<(), TinkError> {
    // 创建AES-GCM密钥管理器
    let key_manager = AesGcmKeyManager::new()?;
    
    // 生成新密钥
    let key_handle = key_manager.new_key(&())?;
    
    // 创建AEAD加密实例
    let aead = key_manager.primitive(&key_handle)?;
    
    // 准备明文数据和关联数据
    let plaintext = b"这是一条需要加密的秘密消息";
    let associated_data = b"额外的上下文信息";
    
    // 加密数据
    let ciphertext = aead.encrypt(plaintext, associated_data)?;
    println!("加密成功,密文长度: {} 字节", ciphertext.len());
    
    // 解密数据
    let decrypted = aead.decrypt(&ciphertext, associated_data)?;
    println!("解密成功,明文: {:?}", String::from_utf8_lossy(&decrypted));
    
    assert_eq!(plaintext, decrypted.as_slice());
    println!("加解密验证成功");
    
    Ok(())
}

// 非对称加密完整示例
fn asymmetric_encryption_example() -> Result<(), TinkError> {
    // 创建ECIES密钥管理器
    let key_manager = EciesAeadHkdfPublicKeyManager::new()?;
    
    // 生成密钥对
    let private_key_handle = key_manager.new_key(&())?;
    let public_key_handle = key_manager.public_key(&private_key_handle)?;
    
    // 创建加密实例(使用公钥)
    let hybrid_encrypt = key_manager.primitive(&public_key_handle)?;
    
    // 加密数据
    let plaintext = b"需要加密的敏感数据";
    let context_info = b"加密上下文信息";
    let ciphertext = hybrid_encrypt.encrypt(plaintext, context_info)?;
    
    println!("非对称加密成功,密文长度: {} 字节", ciphertext.len());
    
    Ok(())
}

// 数字签名完整示例
fn digital_signature_example() -> Result<(), TinkError> {
    // 创建ECDSA签名密钥管理器
    let key_manager = EcdsaSignKeyManager::new()?;
    
    // 生成签名密钥
    let key_handle = key_manager.new_key(&())?;
    
    // 创建签名实例
    let signer = key_manager.primitive(&key_handle)?;
    
    // 签名数据
    let data = b"需要签名的重要文档内容";
    let signature = signer.sign(data)?;
    
    println!("数字签名创建成功");
    println!("数据长度: {} 字节", data.len());
    println!("签名长度: {} 字节", signature.len());
    
    Ok(())
}

// 密钥管理完整示例
fn key_management_example() -> Result<(), TinkError> {
    // 创建新的密钥集句柄
    let mut keyset_handle = KeysetHandle::new();
    
    // 创建AES-GCM密钥管理器
    let key_manager = AesGcmKeyManager::new()?;
    
    // 添加新密钥到密钥集
    let key_id = keyset_handle.add_new_key(key_manager)?;
    println!("已添加新密钥,密钥ID: {}", key_id);
    
    // 设置主密钥
    keyset_handle.set_primary(key_id)?;
    println!("已设置主密钥");
    
    // 序列化密钥集(在实际应用中应该加密存储)
    let serialized = keyset_handle.serialize()?;
    println!("密钥集序列化完成,长度: {} 字节", serialized.len());
    
    Ok(())
}

// 错误处理示例
fn error_handling_example() -> Result<(), TinkError> {
    let key_manager = AesGcmKeyManager::new()?;
    
    match key_manager.new_key(&()) {
        Ok(key_handle) => {
            match key_manager.primitive(&key_handle) {
                Ok(aead) => {
                    println!("加密实例创建成功");
                    Ok(())
                }
                Err(e) => {
                    eprintln!("创建加密实例失败: {}", e);
                    Err(e)
                }
            }
        }
        Err(e) => {
            eprintln!("生成密钥失败: {}", e);
            Err(e)
        }
    }
}

这个库提供了企业级的加密解决方案,适合需要高级安全功能的应用程序。

回到顶部