【问题标题】:How to programatically decrypt a AES256-GCM96 cipher text generated by Vault and export Vault keys?如何以编程方式解密 Vault 生成的 AES256-GCM 96 密文并导出 Vault 密钥?
【发布时间】:2020-11-10 21:22:23
【问题描述】:

我正在尝试备份用于加密/解密数据的保险柜密钥。官方文档说,为了读取密钥,我应该执行以下命令行:

$ 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并用key 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 实现上面提到的内容,我发现自己被阻止了,因为官方doc 提供了以下信息:

  • 加密算法:AES
  • 密钥大小:256 位
  • 模式:GCM
  • GCM 随机数/IV : 96
  • GCM 标签:官方文档中没有提到

我现在有两个问题:在这种情况下我应该使用什么 GCM 标签(无法从源代码中弄清楚)?数字字符串“1604993569”是第四个键的原始格式还是以某种格式编码?

【问题讨论】:

  • 我是对的 - 您的问题是关于如何从您的保管库导出密钥(“我正在尝试备份我的保管库密钥”)?
  • @MichaelFehr 完全正确

标签: encryption cryptography hashicorp-vault aes-gcm


【解决方案1】:

我现在有两个问题:在这种情况下我应该使用什么 GCM 标签(无法从源代码中弄清楚)?数字字符串“1604993569”是第四个键的原始格式还是以某种格式编码?

  1. GCM标签是AEAD认证值,AES-GCM用来验证GMAC消息认证码,从而验证密文的有效性。 它作为密文的一部分存储,通常标签附加在密文本身,在解密过程中会被剥离。

  2. 1604993569 值不是密钥的原始格式。密钥长度为32-bytes。 1604993569 是自底层密钥轮换的 UNIX 纪元以来的时间,i.e. Tuesday, 10 November 2020 07:32:49 UTC。你有四个,因为密钥被旋转了四次。

标签大小是可变的等待实现,但通常是16-bytes,可能是你密文的最后一个16-bytes。

您的密钥被标记为exportable=false,如果没有破解,您无法从 Vault 中导出这些密钥,您无法追溯更改。


我并不惊讶你在苦苦挣扎,Vault 的文档有时会留下很多不足之处。

【讨论】:

    【解决方案2】:

    关于官方API描述https://www.vaultproject.io/api/secret/transit,获取密钥分为三个步骤:

    第 1 步:使密钥可导出(您目前还没有):

    exportable                false
    
    $ vault write transit/keys/guillaume/config exportable=true
    

    第 2 步:导出密钥:

    导出密钥

    此端点返回命名键。键对象显示每个版本的键值。如果指定版本,则返回具体版本。如果提供 latest 作为版本,则将提供当前密钥。根据密钥的类型,可能会返回不同的信息。密钥必须可导出以支持此操作,并且版本必须仍然有效。 方法路径 GET /transit/export/:key_type/:name(/:version) »参数

    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 编码的密钥转换为二进制(字节数组)形式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多