Rust加密库tink-proto的使用:Google Tink安全加密协议的原生Rust实现
Tink-Rust: Protobuf定义
这个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(())
}
注意事项
- 确保在生产环境中使用适当的密钥管理策略
- 定期轮换加密密钥
- 妥善保管主密钥
- 使用最新版本的库以获得安全更新
错误处理
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)
}
}
}
这个库提供了企业级的加密解决方案,适合需要高级安全功能的应用程序。