微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以编程方式解密由保管库生成的AES256-GCM96密文并导出保管库密钥?

如何解决如何以编程方式解密由保管库生成的AES256-GCM96密文并导出保管库密钥?

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

$ 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达到上述要求,我发现自己被封锁了,因为官方doc提供了有关以下信息:

  • 加密算法:AES
  • 密钥大小:256位
  • 模式:GCM
  • GCM Nonce / IV:96
  • GCM标签:官方文档中未提及

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

解决方法

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

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

  2. 1604993569值不是密钥的原始格式。密钥的长度为32-bytes1604993569是自基础键旋转的UNIX时期i.e. Tuesday,10 November 2020 07:32:49 UTC起的时间。钥匙旋转四次后,您有四个。

标记的大小在实施之前是可变的,但通常为16-bytes,很可能是密文的最后16-bytes

您的密钥被标记为exportable=false,如果没有黑客入侵,您将无法从保险柜中导出这些密钥,也无法追溯地更改此密钥。


对于您在挣扎中,我并不感到惊讶,Vau​​lt的文档有时可能有很多不足之处。

,

关于官方API描述https://www.vaultproject.io/api/secret/transit,有以下三个步骤来检索密钥:

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

exportable                false

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

第2步:导出密钥:

导出密钥

此端点返回命名的密钥。 keys对象显示每个版本的密钥值。如果指定了版本,则将返回特定版本。如果提供了最新版本,则将提供当前密钥。根据密钥的类型,可能会返回不同的信息。密钥必须可导出以支持此操作,并且版本必须仍然有效。 方法路径 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编码的密钥转换为二进制(字节数组)形式

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。