11

以下几行显示了如何在 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 中的密钥格式是如何定义的?

4

2 回答 2

0

我遇到了类似的问题,但在单元测试中使用了 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"
    }]
}
于 2020-11-17T20:20:24.707 回答
0

Maarten Bodewes:您介意告诉我们这些 API 有什么问题吗?您认为应该如何改变它?我们都在倾听反馈。

Ursa Major:我们不希望用户直接处理密钥,因为这很容易搞砸。这就是我们提供生成、持久化和加载密钥的 API 的原因。Java HOWTO [1] 展示了如何做到这一点。

看起来您有一个其他格式的现有密钥,您想将它与 Tink 一起使用。Tink 的密钥存储在 protobuf 中。每个键类型都在其自己的 protobuf 中定义。您可以在https://github.com/google/tink/tree/master/proto找到所有定义。Tink 不适用于单个键,但键集也是 protobuf。您可以通过提供 KeysetReader 的实现将现有密钥转换为 Tink 的密钥集。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/src/main /java/com/google/crypto/tink/signature/SignaturePemKeysetReader.java

编辑:更新第二个链接。

于 2019-06-13T19:01:39.523 回答