我最近开始研究“ 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文件中,如下所示:


'pri-p'(主要)
'pub-p'(主要)
'pri-s'(中学)
'pub-s'(中学)


完成此操作后,我编写了一个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


那时,我意识到自己做错了,所以我不得不再次做一遍,以使两个Key都在同一个KeysetHandle中,而我无法像创建KeysetHandle时那样做:

KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);


它已经被标记为主键,如果我从中检索到公钥,那也将是主键。无论我生成多少个密钥,都将使用此密钥将其标记为主要密钥。

还有另一种方法:


创建多个密钥
添加键集
将其中一个标记为主要
创建KeysetHandle
用AWS Kms编写


但是我不确定该怎么做,或者这是否是正确的方法。

在这方面需要一些帮助,我非常感谢。

最佳答案

对的,这是可能的。根据定义,键集可以包含多个键。其中之一是主要的,其余的是活动的。主键可以签名和验证,但活动密钥只能验证。

这是您可以执行的操作:

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文件。

希望能有所帮助,
泰国。

10-01 12:15