本文介绍了如何使用JSON格式封装加密和签名密钥,以及JSON格式在密钥管理中的优势。通过Google Tink展示了对称密钥、消息认证码、数字签名和混合加密等多种密钥类型的JSON格式示例,并列举了几乎所有可用的密钥类型,以及如何使用tinkey工具生成JSON格式的密钥集。
有多少种加密和签名密钥格式?答案是,非常多。为什么?因为现在我们可以用 JSON 格式包装一个加密密钥,它提供了关于如何使用加密密钥的额外信息。
对于计算机来说,这些密钥只是一堆 1 和 0,但对于人类来说,我们不太擅长解释二进制。两种常见的格式是 DER(二进制)和 PEM(Base64)。当解释为十六进制时,DER 看起来像这样[ 这里]:
PEM 格式稍微结构化一些,带有特殊的报头和报尾,中间是 Base64 文本:
这些文件格式都没有过多地展示密钥的细节,例如它的标识符、使用的加密类型等等。因此,JSON 格式经常用于查看密钥,而 Google Tink 是查看密钥的好地方。有了它,我们可以定义一个对称密钥,并在其中给出密钥和 ID,然后定义密钥类型(因为我们可以使用一系列加密方法)。在下面的例子中,我们使用一个 AES GCM 密钥:[ 链接]
{
"primaryKeyId": 1331912396,
"key": [{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",\
"keyMaterialType": "SYMMETRIC",\
"value": "GhBpskWWTrE27e2w67X4TzfS"\
},\
"outputPrefixType": "TINK",\
"keyId": 1331912396,\
"status": "ENABLED"\
}]
}
密钥是 "GhBpskWWTrE27e2w67X4TzfS"。十六进制格式是:
1A1069B245964EB136EDEDB0EBB5F84F37D2
它是 36 个十六进制字符,也就是 144 位。这为密钥提供了 128 位,为一些参数提供了一些额外的位。
对于 MAC(消息认证码),我们使用一个共享密钥,然后可以使用它来检查消息的签名[ 这里]。同样,在这种情况下,我们生成一个 128 位的 AES GCM 密钥[ 这里]:
{
"primaryKeyId": 1331912396,
"key": [{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",\
"keyMaterialType": "SYMMETRIC",\
"value": "GhBpskWWTrE27e2w67X4TzfS"\
},\
"outputPrefixType": "TINK",\
"keyId": 1331912396,\
"status": "ENABLED"\
}]
}
在数字签名中,我们使用一个密钥对(一个公钥和一个私钥)。私钥用于对消息进行签名,然后公钥证明签名者。在这种情况下,我们在发送方创建一条椭圆曲线密钥对[ 链接]:
{
“primaryKeyId”: 438545957,
“key”: [{\
“keyData”: {\
“typeUrl”: “type.googleapis.com/google.crypto.tink.EcdsaPrivateKey”,\
“keyMaterialType”: “ASYMMETRIC_PRIVATE”,\
“value”: “Ek0SBggDEAIYAhohAP4v0pziVF9He/fn8BgApUHOu2Y1TkMcejrYC4U24M3xIiBAf0AIU72H5uVIP1S6ULGLaDf4td3/RIb4F58z2Md/khogJsuTDxaY/Q0CmENKlTQIOCXEZ+qvdAW0Rkvix6Wehl4=”\
},\
“outputPrefixType”: “TINK”,\
“keyId”: 438545957,\
“status”: “ENABLED”\
}]
}
然后我们提取公钥来证明签名:
{
“primaryKeyId”: 438545957,
“key”: [{\
“keyData”: {\
“typeUrl”: “type.googleapis.com/google.crypto.tink.EcdsaPublicKey”,\
“keyMaterialType”: “ASYMMETRIC_PUBLIC”,\
“value”: “EgYIAxACGAIaIQD+L9Kc4lRfR3v35/AYAKVBzrtmNU5DHHo62AuFNuDN8SIgQH9ACFO9h+blSD9UulCxi2g3+LXd/0SG+BefM9jHf5I=”\
},\
“outputPrefixType”: “TINK”,\
“keyId”: 438545957,\
“status”: “ENABLED”\
}]
}
十六进制格式是 12060803100218021A2100FE2FD29CE2545F477BF7E7F01800A541CEBB66354E431C7A3AD80B8536E0CDF12220407F400853BD87E6E5483F54BA50B18B6837F8B5DDFF4486F8179F33D8C77F92,它是 154 个十六进制字符 (616 位 —— 由 512 位公钥和一些额外的字节组成,用于定义密钥的格式)。
在许多应用中,我们使用混合方法,可以用一个密钥对来保护对称密钥。在下面的例子中,我们使用 ECIES 加密来保护我们创建的对称密钥,然后使用公钥[ 链接]。然后使用私钥来解密对称密钥:
{
“primaryKeyId”: 1992984960,
“key”: [{\
“keyData”: {\
“typeUrl”: “type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey”,\
“keyMaterialType”: “ASYMMETRIC_PUBLIC”,\
“value”: “EkQKBAgCEAMSOhI4CjB0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5jcnlwdG8udGluay5BZXNHY21LZXkSAhAQGAEYARohAOaHVTjvjhpGaHv5mhuXz3Nc+Mb7RE5sMyAsv7YCB8UjIiAOaSLbqRE7ddVM14kWiNoPWB/U2MNluwLlAjw39zwAlw==”\
},\
“outputPrefixType”: “TINK”,\
“keyId”: 1992984960,\
“status”: “ENABLED”\
}]
}
还有一种方法允许你使用额外的数据认证你的加密,例如数据包的序列号或使用的 TCP 端口。这被称为带有关联数据的认证加密 (AEAD),这里有一个使用 AES-SIV 的密钥示例[ 这里]:
{
"primaryKeyId": 1428191678,
"key": [{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.AesSivKey",\
"keyMaterialType": "SYMMETRIC",\
"value": "EkAFkhmlhYkmClmpz/vGzojJVgA/IQIMSty7rL8TXxyu9m/W0ZtzCddmSLFj7r8V/R0CywJ89KxdMVzdR+GDQH2w"\
},\
"outputPrefixType": "TINK",\
"keyId": 1428191678,\
"status": "ENABLED"\
}]
}
所以,你的加密密钥可以用 JSON 查看。
让我们来看看如何为 AES、DHKEM (Hybrid ML-KEM)、ECDSA、ECIES、Ed25519、HKDF、HMAC、JWT、RSA PKCS#1 v1.5、RSA PSS 和 XChaCha20 创建密钥:
为此,我们可以使用 tinkey 运行:
$ java -jar "tinkey_deploy.jar" create-keyset - key-template AES128_EAX - out-format JSON - out 1.json
$ cat 1.json
{"primaryKeyId":2180785869,"key":
[{"keyData":{\
"typeUrl":"type.googleapis.com_google.crypto.tink.AesEaxKey",\
"value":"EgIIEBoQkkUmFOG1mkQFBTuuLyy6Mw==",\
"keyMaterialType":"SYMMETRIC"},\
"status":"ENABLED",\
"keyId":2180785869,\
"outputPrefixType":"TINK"}]
}
代码在这里:
对于 AES_EAX [ 这里]:
{
"primaryKeyId": 1396503152,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.AesEaxKey",\
"value": "EgIIEBoQ6RkAIuX/Atj/SkqcpswobA==",\
"keyMaterialType": "SYMMETRIC"\
},\
"status": "ENABLED",\
"keyId": 1396503152,\
"outputPrefixType": "TINK"\
}\
]
}
对于 ChaCha20 [ 这里]:
{
"primaryKeyId": 1961123280,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",\
"value": "EiBGO18rw7WEmiWmDhWtdeLh9yifxqh8ZiRkEc+w0Axaxw==",\
"keyMaterialType": "SYMMETRIC"\
},\
"status": "ENABLED",\
"keyId": 1961123280,\
"outputPrefixType": "TINK"\
}\
]
}
对于 DH-ML-KEM [ 这里]:
{
"primaryKeyId": 471886363,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.HpkePrivateKey",\
"value": "EksSBggCEAEYARpBBEPwo/feGpb3vlP+PqHmfNcyx4MFiUhmgI6UTlYeOE3CuPlPEr29y10xpEnU7Rbz/68rC/DKtIQgj9wxSqy2jIAaINRX8U+vDAMHohP7pB0eL4APBLGucNXmrNQ/LlKTXMde",\
"keyMaterialType": "ASYMMETRIC_PRIVATE"\
},\
"status": "ENABLED",\
"keyId": 471886363,\
"outputPrefixType": "TINK"\
}\
]
}
对于 ECDSA [ 这里]:
{
"primaryKeyId": 1264604753,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",\
"value": "Ek4SBggDEAIYAhohADjXTBYypwLxLyv16U1Cjc65bOThbbuy6fLUW/KRPW2+IiEAeNVl+SBSsCTcan65Ak/INw0LxdA7QjxYjhlUwV9jv18aIQDt6E9K9l2uTaMqrptTL+fwMsy4jErqNQrzTLsYB242GQ==",\
"keyMaterialType": "ASYMMETRIC_PRIVATE"\
},\
"status": "ENABLED",\
"keyId": 1264604753,\
"outputPrefixType": "TINK"\
}\
]
}
对于 Ed25519 [ 这里]:
{
"primaryKeyId": 548270440,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",\
"value": "EiBgPvg/MifqxLPxSSJNDX2sVf1vmsXTqA+adiDVHI5LaBoiEiBN/JwLTuGB1fan3TCMBLXPx6aeMhNQ7t/tpJXltxpZiQ==",\
"keyMaterialType": "ASYMMETRIC_PRIVATE"\
},\
"status": "ENABLED",\
"keyId": 548270440,\
"outputPrefixType": "TINK"\
}\
]
}
对于 RSA PSS [ 这里]:
{
"primaryKeyId": 744063254,
"key": [\
{\
"keyData": {\
"typeUrl": "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey",\
"value": "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",\
"keyMaterialType": "ASYMMETRIC_PRIVATE"\
},\
"status": "ENABLED",\
"keyId": 744063254,\
"outputPrefixType": "TINK"\
}\
]
}
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!