Построение ключа в Tink для KeysetHandle

Следующие строки показывают, как сгенерировать ключ в Tink:

  • keysetHandle=KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM)
  • privateKeysetHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256)

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


Также возможно создать ключ, загрузив параметры из JSON:

  String keysetFilename = "my_keyset.json";
  KeysetHandle keysetHandle = CleartextKeysetHandle.read(
          JsonKeysetReader.withFile(new File(keysetFilename)));

Как определяется формат ключа в JSON?


person Ursa Major    schedule 17.05.2019    source источник
comment
@MaartenBodewes, вы можете попробовать: tinkey create-keyset --key-template AES128_GCM --out example.json и tinkey add-key --key-template ECDSA_P256 --in example.json --out example2.json или что-то в этом роде.   -  person Paweł Prażak    schedule 19.11.2020


Ответы (2)


Maarten Bodewes: не могли бы вы рассказать нам, что не так с API и как, по вашему мнению, его следует изменить? Мы все прислушиваемся к отзывам.

Большая Медведица: мы не хотим, чтобы пользователи имели дело с ключами напрямую, потому что их легко запутать. Вот почему мы предоставляем API, которые генерируют, сохраняют и загружают ключи. Java HOWTO [1] показывает, как это сделать.

Похоже, у вас есть существующий ключ в другом формате, который вы хотите использовать с Tink. Ключи Тинка хранятся в protobuf. Каждый тип ключа определяется в своем protobuf. Все определения можно найти на странице https://github.com/google/tink/tree/master/proto. Tink работает не с отдельными ключами, а с наборами ключей, которые также являются протобуфами. Вы можете преобразовать существующие ключи в наборы ключей Tink, предоставив реализацию KeysetReader. SignaturePemKeysetReader [2] — это пример, который преобразует определенные ключи PEM в Tink.

Если у вас возникнут какие-либо дополнительные проблемы, не стесняйтесь оставлять комментарии или писать по электронной почте в список рассылки по адресу [email protected].

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

[1] https://github.com/google/tink/blob/master/docs/JAVA-HOWTO.md [2] https://github.com/google/tink/blob/master/java_src/src/main/java/com/google/crypto/tink/signature/SignaturePemKeysetReader.java

изменить: обновить вторую ссылку.

person Thai Duong    schedule 13.06.2019
comment
как Tink следует использовать с секретами Kubernetes? - person Paweł Prażak; 19.11.2020

У меня была похожая проблема, но с HMAC в модульных тестах. Надеюсь, поможет.

Пример JSON:

{
    "primaryKeyId": 2061245617,
    "key": [{
        "keyData": {
            "typeUrl": "type.googleapis.com/google.crypto.tink.HmacKey",
            "keyMaterialType": "SYMMETRIC",
            "value": "EgQIAxAgGiB9qbGjo1sA41kHHKbELAKmFzj3cNev0GJ3PpvhR00vuw=="
        },
        "outputPrefixType": "TINK",
        "keyId": 2061245617,
        "status": "ENABLED"
    }]
}

код, используемый для его генерации (Scala):

  import com.google.crypto.tink.mac.MacConfig
  MacConfig.register()

  def generate(): Unit = {
    import java.io.ByteArrayOutputStream
    import java.nio.charset.StandardCharsets
    import com.google.crypto.tink.mac.HmacKeyManager
    import com.google.crypto.tink.{CleartextKeysetHandle, JsonKeysetWriter, KeysetHandle}
    
    val generatedKeyset = KeysetHandle.generateNew(HmacKeyManager.hmacSha256Template())
    val output = new ByteArrayOutputStream
    CleartextKeysetHandle.write(generatedKeyset, JsonKeysetWriter.withOutputStream(output))
    println(output.toString(StandardCharsets.UTF_8))
  }
  generate()

Загрузка JSON и использование:

import com.google.crypto.tink.{CleartextKeysetHandle, JsonKeysetReader}
val hmacKeyset = CleartextKeysetHandle.read(
    JsonKeysetReader.withString(...)
)
val mac = hmacKeyset.getPrimitive(classOf[Mac])
mac.computeMac(...)

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


Соответствующие части реализации:


EDIT: еще более простой способ создания набора ключей JSON:

$ tinkey create-keyset --key-template HMAC_SHA256_256BITTAG
{
    "primaryKeyId": 1132518908,
    "key": [{
        "keyData": {
            "typeUrl": "type.googleapis.com/google.crypto.tink.HmacKey",
            "keyMaterialType": "SYMMETRIC",
            "value": "EgQIAxAgGiDwIucBpWJ8WHVIEKIdEVQlfynm+4QS8sKUVUga2JzRlw=="
        },
        "outputPrefixType": "TINK",
        "keyId": 1132518908,
        "status": "ENABLED"
    }]
}
person Paweł Prażak    schedule 17.11.2020