如何向cleartext_keyset_json传入有效值以创建Tink密钥?自定义有效密钥集及AesGcmKey的value有效值咨询
关于Tink框架JSON明文密钥集的两个技术问题解答
我来帮你搞定这两个Tink框架里的JSON密钥集问题:
问题1:如何向cleartext_keyset_json传入有效值以创建Tink密钥?
最稳妥的方式是通过Tink官方API生成合法密钥集,再序列化成JSON格式,这样得到的内容直接就能传给cleartext_keyset_json使用,不会踩格式或结构的坑。
举个Python的示例代码:
import tink from tink import aead from tink import json_keyset_reader from tink import json_keyset_writer import io # 初始化AEAD类型的密钥管理器 aead.register() # 生成AES-GCM密钥集 key_template = aead.aead_key_templates.AES128_GCM keyset_handle = tink.new_keyset_handle(key_template) # 将密钥集序列化为JSON字符串 output = io.StringIO() writer = json_keyset_writer.JsonKeysetWriter(output) keyset_handle.write(writer) valid_json = output.getvalue() # 现在valid_json就是可以直接用的cleartext_keyset_json有效值 print(valid_json)
用这种方式生成的JSON,所有字段(包括primaryKeyId、key[].keyData.value等)都会严格符合Tink的要求,直接传入就能创建出有效的密钥。
问题2:能否自定义密钥集的键值对生成有效密钥集?AesGcmKey对应的value有效值是什么?
可以自定义,但每个字段都必须严格匹配Tink对应密钥类型的protobuf结构,尤其是你踩坑的value字段——它不是随便的字符串,而是对应密钥protobuf对象序列化后的二进制数据,再经过Base64编码的结果。
针对type.googleapis.com/google.crypto.tink.AesGcmKey类型,它的protobuf定义大致是:
message AesGcmKey { uint32 version = 1; // Tink中AesGcmKey的固定版本是0 bytes key_value = 2; // 必须是16字节(AES-128)或32字节(AES-256)的随机密钥字节 }
所以value字段的有效值需要满足:
- 先构造符合上述protobuf结构的对象:version设为0,key_value是16/32字节的随机二进制数据;
- 将这个protobuf对象序列化为二进制字节流;
- 把二进制字节流做Base64编码,得到的字符串就是
value的有效值。
你之前触发的INVALID_ARGUMENT错误,就是因为自定义的value解码后的二进制数据,无法解析成合法的AesGcmKey protobuf对象(比如长度不对、版本号错误,或者根本不是protobuf格式)。
如果一定要手动构造,建议用protobuf工具生成对应的二进制数据再编码,比如用protoc编译Tink的proto文件后,通过代码生成合法的密钥对象再序列化,比纯手动写字符串靠谱得多。
内容的提问来源于stack exchange,提问作者user3776598
相关产品推荐
相关产品推荐

