Несколько пар частного / открытого ключа в 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
В то время я понял, что то, что я сделал, было неправильно, и мне пришлось сделать это снова, так что оба ключа находятся в одном и том же KeysetHandle, и я не могу это сделать, как при создании KeysetHandle, например:
KeysetHandle pri = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
Он уже помечен как первичный ключ, и если я получу из него открытый ключ, это также будет первичный ключ. Независимо от того, сколько ключей я сгенерирую, все будут помечены как основные, используя это.
Есть другой способ:
- Создать несколько ключей
- Добавить в Keyset
- Отметить один из них как основной
- Создать KeysetHandle
- Написать в AWS Kms
Но я не уверен, как это сделать, или это правильный путь.
Нужна помощь в этом, я бы очень признателен.
1 ответ
Да, это возможно. Набор ключей по определению может содержать несколько ключей. Один из них является первичным, а остальные активными. Первичный ключ может подписывать и проверять, но только активные могут проверять.
Вот как вы можете это сделать:
1 / Создайте новый KeysetHandle, который содержит два ключа, используя KeysetManger:
KeysetManager km = KeysetManager.withEmptyKeyset();
// Add a primary key
km.rotate(SignatureKeyTemplates.ECDSA_P256);
// Add a secondary key
km.add(SignatureKeyTemplates.ECDSA_P256);
2 / Получить KeysetHandle из KeyManager
KeysetHandle kh = km.getKeyHandle()
3 / Зашифруйте и запишите его в файл JSON, как вы это делали в своем коде.
Надеюсь, это поможет, тайский.