Tink中的多个私钥/公钥对

时间:2019-01-29 17:11:57

标签: java authentication encryption rsa tink

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

  1. 'pri-p'(主要)
  2. “ pub-p”(主要)
  3. “ pri-s”(中学)
  4. “ 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

那时候,我意识到自己做错了,所以我不得不再次做一次,以使两个 Keys 都位于同一个 KeysetHandle 中,并且我无法像创建

那样创建KeysetHandle那样做
KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);

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

还有另一种方式:

  1. 创建多个
  2. 添加键集
  3. 将其中一个标记为主要
  4. 创建 KeysetHandle
  5. 在AWS Kms中写入

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

对此需要帮助,我非常感谢。

1 个答案:

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

希望有帮助, 泰语。