如何以编程方式解密 Vault 生成的 AES256-GCM 96 密文并导出 Vault 密钥?
How to programatically decrypt a AES256-GCM96 cipher text generated by Vault and export Vault keys?
我正在尝试将我正在使用的 Vault 密钥备份到 encrypt/decrypt 我的数据。官方文档说,为了读取密钥,我应该执行以下命令行:
$ vault read transit/keys/orders
Key Value
--- -----
allow_plaintext_backup false
deletion_allowed false
derived false
exportable false
keys map[1:1604988997 2:1604993553 3:1604993556 4:1604993569]
latest_version 4
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name orders
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
如您所知,我有 4 把“钥匙”。为了确保这些数字字符串是正确的键,我决定进行以下操作:
考虑普通的 4111 1111 1111 1111
1-将纯文本转换为base64并使用密钥n°4加密:
$ vault write transit/encrypt/orders plaintext=$(base64 <<< "4111 1111 1111 1111")
Key Value
--- -----
ciphertext vault:v4:F6hjhlJM8xczv8J20zQTRMWn3RflTd6UhcWLD9NOsEt+MQJjy4LlyAY5SY6UyydN
key_version 4
2- 获取上面生成的密文并使用密钥 n°4 1604993569 和 AES256-GCM96
以编程方式对其进行解密
在这个阶段,如果我想使用 Java Cryptography Extension I find myself blocked because the official doc 实现上面提到的内容,请提供有关信息:
- 加密算法:AES
- 密钥大小:256 位
- 模式:GCM
- GCM Nonce/IV : 96
- GCM 标签:官方文档中未提及
我现在有两个问题:在这种情况下我应该使用什么 GCM 标签(无法从源代码中弄清楚)?数字字符串“1604993569”是第四个密钥的原始格式还是以某种格式编码?
I have two questions now : What is the GCM tag I should use in this case (could not figure out that from the source code)? Is the numerical string "1604993569" the raw format of the 4th key or is it encoded in some format?
GCM标签是AEAD认证值,AES-GCM用来验证GMAC报文认证码,从而验证密文的有效性。 它作为密文的一部分存储,通常标签附加到密文本身,并在解密过程中被剥离。
1604993569
值不是密钥的原始格式。密钥的长度为 32-bytes
。 1604993569
是自底层密钥轮换的 UNIX 纪元以来的时间,i.e. Tuesday, 10 November 2020 07:32:49 UTC
。你有四个,因为钥匙旋转了四次。
标签大小可变,等待实施,但通常 16-bytes
,可能是您密文的最后一个 16-bytes
。
你的密钥被标记为 exportable=false
,你不能在没有破解的情况下从 Vault 导出这些密钥,你不能追溯更改它。
我对你的挣扎并不感到惊讶,Vault 的文档有时可能会有很多不足之处。
关于官方 API 描述 https://www.vaultproject.io/api/secret/transit 检索密钥的三个步骤:
第 1 步:使密钥可导出(目前您的密钥不可导出):
exportable false
$ vault write transit/keys/guillaume/config exportable=true
第 2 步:导出密钥:
导出密钥
此端点returns 命名键。键对象显示每个版本的键值。如果指定版本,将返回具体版本。如果提供最新版本作为版本,则将提供当前密钥。根据密钥的类型,可能会返回不同的信息。密钥必须可导出以支持此操作,并且版本必须仍然有效。
方法路径
GET /transit/export/:key_type/:名称(/:版本)
»参数
key_type (string: <required>) – Specifies the type of the key to export. This is specified as part of the URL. Valid values are:
encryption-key
signing-key
hmac-key
name (string: <required>) – Specifies the name of the key to read information about. This is specified as part of the URL.
version (string: "") – Specifies the version of the key to read. If omitted, all versions of the key will be returned. This is specified as part of the URL. If the version is set to latest, the current key will be returned.
»索取样品
$ curl \
--header "X-Vault-Token: ..." \
http://127.0.0.1:8200/v1/transit/export/encryption-key/my-key/1
»样本响应
{
"data": {
"name": "foo",
"keys": {
"1": "eyXYGHbTmugUJn6EtYD/yVEoF6pCxm4R/cMEutUm3MY=",
"2": "Euzymqx6iXjS3/NuGKDCiM2Ev6wdhnU+rBiKnJ7YpHE="
}
}
}
第 3 步:将 Base64 编码的密钥转换为二进制(字节数组)形式
我正在尝试将我正在使用的 Vault 密钥备份到 encrypt/decrypt 我的数据。官方文档说,为了读取密钥,我应该执行以下命令行:
$ vault read transit/keys/orders
Key Value
--- -----
allow_plaintext_backup false
deletion_allowed false
derived false
exportable false
keys map[1:1604988997 2:1604993553 3:1604993556 4:1604993569]
latest_version 4
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name orders
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
如您所知,我有 4 把“钥匙”。为了确保这些数字字符串是正确的键,我决定进行以下操作: 考虑普通的 4111 1111 1111 1111
1-将纯文本转换为base64并使用密钥n°4加密:
$ vault write transit/encrypt/orders plaintext=$(base64 <<< "4111 1111 1111 1111")
Key Value
--- -----
ciphertext vault:v4:F6hjhlJM8xczv8J20zQTRMWn3RflTd6UhcWLD9NOsEt+MQJjy4LlyAY5SY6UyydN
key_version 4
2- 获取上面生成的密文并使用密钥 n°4 1604993569 和 AES256-GCM96
以编程方式对其进行解密在这个阶段,如果我想使用 Java Cryptography Extension I find myself blocked because the official doc 实现上面提到的内容,请提供有关信息:
- 加密算法:AES
- 密钥大小:256 位
- 模式:GCM
- GCM Nonce/IV : 96
- GCM 标签:官方文档中未提及
我现在有两个问题:在这种情况下我应该使用什么 GCM 标签(无法从源代码中弄清楚)?数字字符串“1604993569”是第四个密钥的原始格式还是以某种格式编码?
I have two questions now : What is the GCM tag I should use in this case (could not figure out that from the source code)? Is the numerical string "1604993569" the raw format of the 4th key or is it encoded in some format?
GCM标签是AEAD认证值,AES-GCM用来验证GMAC报文认证码,从而验证密文的有效性。 它作为密文的一部分存储,通常标签附加到密文本身,并在解密过程中被剥离。
1604993569
值不是密钥的原始格式。密钥的长度为32-bytes
。1604993569
是自底层密钥轮换的 UNIX 纪元以来的时间,i.e. Tuesday, 10 November 2020 07:32:49 UTC
。你有四个,因为钥匙旋转了四次。
标签大小可变,等待实施,但通常 16-bytes
,可能是您密文的最后一个 16-bytes
。
你的密钥被标记为 exportable=false
,你不能在没有破解的情况下从 Vault 导出这些密钥,你不能追溯更改它。
我对你的挣扎并不感到惊讶,Vault 的文档有时可能会有很多不足之处。
关于官方 API 描述 https://www.vaultproject.io/api/secret/transit 检索密钥的三个步骤:
第 1 步:使密钥可导出(目前您的密钥不可导出):
exportable false
$ vault write transit/keys/guillaume/config exportable=true
第 2 步:导出密钥:
导出密钥
此端点returns 命名键。键对象显示每个版本的键值。如果指定版本,将返回具体版本。如果提供最新版本作为版本,则将提供当前密钥。根据密钥的类型,可能会返回不同的信息。密钥必须可导出以支持此操作,并且版本必须仍然有效。 方法路径 GET /transit/export/:key_type/:名称(/:版本) »参数
key_type (string: <required>) – Specifies the type of the key to export. This is specified as part of the URL. Valid values are:
encryption-key
signing-key
hmac-key
name (string: <required>) – Specifies the name of the key to read information about. This is specified as part of the URL.
version (string: "") – Specifies the version of the key to read. If omitted, all versions of the key will be returned. This is specified as part of the URL. If the version is set to latest, the current key will be returned.
»索取样品
$ curl \
--header "X-Vault-Token: ..." \
http://127.0.0.1:8200/v1/transit/export/encryption-key/my-key/1
»样本响应
{
"data": {
"name": "foo",
"keys": {
"1": "eyXYGHbTmugUJn6EtYD/yVEoF6pCxm4R/cMEutUm3MY=",
"2": "Euzymqx6iXjS3/NuGKDCiM2Ev6wdhnU+rBiKnJ7YpHE="
}
}
}
第 3 步:将 Base64 编码的密钥转换为二进制(字节数组)形式