【问题标题】:Key construction in Tink for KeysetHandleTink 中用于 KeysetHandle 的密钥构造
【发布时间】:2019-10-05 02:57:30
【问题描述】:

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

【问题讨论】:

  • @MaartenBodewes 你可以试试:tinkey create-keyset --key-template AES128_GCM --out example.jsontinkey add-key --key-template ECDSA_P256 --in example.json --out example2.json 或类似的东西。

标签: cryptography tink


【解决方案1】:

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

编辑:更新第二个链接。

【讨论】:

  • Tink 应该如何与 Kubernetes 机密一起使用?
【解决方案2】:

我也遇到过类似的问题,但在单元测试中使用了 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"
    }]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多