Недавно я начал изучать "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, который возвращал клиенту оба открытых ключа (первичный и вторичный), и ответ был таким:
({
"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"
}]
})
Теперь я хотел сделать вторичный неактивным, чтобы его никто не использовал, что означает статус: ОТКЛЮЧЕНО, используя код, как показано ниже:
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);
Он уже помечен как первичный ключ, и если я получу из него открытый ключ, он также будет первичным ключом. Независимо от того, сколько ключей я сгенерирую, все они будут помечены как первичные.
Есть еще один способ:
- Создайте несколько ключей
- Добавить набор ключей
- Отметьте один из них как основной
- Создайте KeysetHandle
- Напишите в кмс AWS
Но я не уверен, как это сделать, или это правильный путь.
Нужна помощь в этом, буду очень признателен.