Несколько пар частного / открытого ключа в Tink - PullRequest
0 голосов
/ 29 января 2019

Я недавно начал изучать "Дозор" и теперь столкнулся с определенной проблемой, и не смог найти решение в документах или в Интернете.

Случай: Я хочу иметь два набора пар ключей Public / Private.Один из них будет активен, а другой будет отключен.

То, что я сделал, - это сгенерировал 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. Добавить Набор ключей
  3. Отметитьодин из них в качестве основного
  4. Create KeysetHandle
  5. Запись в AWS Kms

Но я не уверен, как это сделать, илиявляется ли это правильный путь.

Нужна помощь в этом, я бы очень признателен.

1 Ответ

0 голосов
/ 31 января 2019

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

Вот как вы можете это сделать:

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, как вы это делали в своем коде.

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

...