我最近开始研究“ Tink” ,但现在遇到了一个特定的问题,无法在文档或在线中找到解决方案。
情况是: 我想拥有两组公共/私人密钥对。一个将处于活动状态,而另一个将被禁用。
我所做的就是生成这样的 KeyHandle ,并将其存储在 AWS KMS 中:
KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
KeysetHandle pub = privateKeySetHandle.getPublicKeysetHandle();
pri.write(JsonKeysetWriter.withFile(new File("pri_p")),
new AwsKmsClient().withDefaultCredentials().getAead(keyStoreUrl));
pub.write(JsonKeysetWriter.withFile(new File("pub_p")),
new AwsKmsClient().withDefaultCredentials().getAead("someUrl"));
//*************** Same code for secondary **************
KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
KeysetHandle pub = privateKeySetHandle.getPublicKeysetHandle();
pri.write(JsonKeysetWriter.withFile(new File("pri_s")),
new AwsKmsClient().withDefaultCredentials().getAead(keyStoreUrl));
pub.write(JsonKeysetWriter.withFile(new File("pub_s")),
new AwsKmsClient().withDefaultCredentials().getAead("someUrl"));
之所以这样做,是因为我认为我会生成两对并将它们保存在不同的json文件中,如:
完成此操作后,我编写了一个API,该API将两个公共密钥(主密钥和辅助密钥)都返回给客户端,并且响应为:
({
"primaryKeyId": 12345,
"key": [{
"keyData": {
"typeUrl": "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
"keyMaterialType": "ASYMMETRIC_PUBLIC",
"value": "IDJNVUs,csaIQDP9jhF+MERyoZ6Ede/LteBYS0n4zVbYTcuCZCiFBERhyIhAJettefH3BPjFyyZC3m90Pw+m/K8sjiEPS"
},
"outputPrefixType": "TINK",
"keyId": 12345,
"status": "ENABLED"
}]
},{
"primaryKeyId": 6789,
"key": [{
"keyData": {
"typeUrl": "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
"keyMaterialType": "ASYMMETRIC_PUBLIC",
"value": "EgYI7hfsdhfsdm0eeii3m43434334390439TcuCZCiFBERhyIhAJettefH3BPjFyyZC3m90Pw+m/K8sjiEPSXKSMgmWEgr"
},
"outputPrefixType": "TINK",
"keyId": 6789,
"status": "ENABLED"
}]
})
现在,我想使第二个为非活动状态,以便没人使用它,这意味着状态:DISABLED 使用以下代码:
KeysetHandle secondaryPublicKey = KeysetManager
.withKeysetHandle(secondaryPublicKey)
.disable(keySetHandle.getKeysetInfo().getPrimaryKeyId())
.getKeysetHandle();
但是我得到的例外是:
java.security.generalsecurityexception: cannot disable the primary key
那时候,我意识到自己做错了,所以我不得不再次做一次,以使两个 Keys 都位于同一个 KeysetHandle 中,并且我无法像创建
那样创建KeysetHandle那样做KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
它已经被标记为主键,如果我从中检索到公钥,那也将是主键。无论我生成多少个密钥,都将使用此密钥将其标记为主要密钥。
还有另一种方式:
但是我不确定该怎么做,或者这是否是正确的方法。
对此需要帮助,我非常感谢。
答案 0 :(得分:0)
是的,有可能。根据定义,键集可以包含多个键。其中之一是主要的,其余的是活动的。主键可以签名和验证,但活动密钥只能验证。
这是您可以执行的操作:
1 /使用KeysetManger生成一个包含两个键的新KeysetHandle:
KeysetManager km = KeysetManager.withEmptyKeyset();
// Add a primary key
km.rotate(SignatureKeyTemplates.ECDSA_P256);
// Add a secondary key
km.add(SignatureKeyTemplates.ECDSA_P256);
2 /从KeyManager检索KeysetHandle
KeysetHandle kh = km.getKeyHandle()
3 /像在代码中一样加密并写入JSON文件。
希望有帮助, 泰语。