Конструкция ключа в 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?

0 ответов

Маартен Бодевес: не могли бы вы рассказать нам, что не так с API-интерфейсами и как, по вашему мнению, это следует изменить? Мы все слышим отзывы.

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

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

Если у вас возникнут дальнейшие проблемы, не стесняйтесь оставлять комментарии или писать в список рассылки по адресу tink-users@googlegroups.com.

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

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

У меня была аналогичная проблема, но с 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(...)

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


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


РЕДАКТИРОВАТЬ: еще более простой способ создания набора ключей 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"
    }]
}
Другие вопросы по тегам