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