Несколько пар частного / открытого ключа в 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, который возвращал клиенту как открытые ключи (первичный, так и вторичный), и получил ответ:

({
"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);

Он уже помечен как первичный ключ, и если я получу из него открытый ключ, это также будет первичный ключ. Независимо от того, сколько ключей я сгенерирую, все будут помечены как основные, используя это.

Есть другой способ:

  1. Создать несколько ключей
  2. Добавить в Keyset
  3. Отметить один из них как основной
  4. Создать KeysetHandle
  5. Написать в 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, как вы это делали в своем коде.

Надеюсь, это поможет, тайский.

Другие вопросы по тегам