如何使用 AWS KMS 非对称密钥,通过 OpenSSL 加密文件?

上次更新日期:2022 年 8 月 4 日

我想使用 Key Management Service (AWS KMS) 密钥,通过 OpenSSL 加密文件。我该如何操作?

简短描述

您无法使用 RSA 密钥加密大量数据。例如,要使用 RSAES_OAEP_SHA_256 加密大小为 2048 字节的 RSA 密钥对,可以加密的最大数量为 190 字节。借助 Advanced Encryption Standard (AES) 密钥,您可以使用密码块链 (CBC) 将数据拆分为更小的部分。

解决方案

按照以下说明使用 CBC 加密和解密密钥。

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

创建 RSA 密钥对,下载公有密钥,以及创建 AES 256 位密钥

1.    按照说明使用 AWS 管理控制台创建 RSA 密钥对

2.    使用类似于以下内容的 AWS CLI 命令 get-public-key 下载公有密钥:

$ aws kms get-public-key --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --output text --query 'PublicKey' > RSAPublic.b64 && base64 -d RSAPublic.b64 > RSAPublic.bin
注意: --query 函数仅获取公有密钥,然后将 base64 文件解码为 DER 密钥。

3.    使用 OpenSSL rand 命令创建 AES 256 位密钥以生成随机数据,然后输出到 key.bin 文件中,如下所示:

$ openssl rand -base64 32 > key.bin

加密数据

1.    结合使用 key.bin 文件和在 CBC 中加密的 OpenSSL enc 命令对数据进行加密,如下所示:

$ openssl enc -aes-256-cbc -salt -pbkdf2 -in FILE_TO_ENCRYPT -out FILE_TO_ENCRYPT.enc -pass file:./key.bin

注意:

  • -pbkdf2 命令仅适用于 OpenSSL 1.1.1。Amazon Linux 2 AMI 安装有 OpenSSL 1.0.2,该版本不支持 -pbkdf2 命令。
  • CBC 允许您加密任何大小的文件。
  • 将值 FILE_TO_ENCRYPT 替换为要加密的文件的名称。

2.    使用 AWS KMS 公有密钥加密您的 AES 256 位密钥 key.bin。这将验证您的数据密钥是否安全。仅限有权访问您的 AWS KMS 私有密钥的用户访问 key.bin 密钥。

运行类似于以下内容的 OpenSSL pkeyutl 命令:

$ openssl pkeyutl -in key.bin -out enc.key.bin -inkey RSAPublic.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

注意:pkeyutl 命令使用 AWS KMS API (RSAES_OAEP_SHA_256) 支持解密的加密算法。AWS KMS 公有密钥 RSAPublic.bin 对 AES 256 密钥进行加密,并创建名为 enc.key.bin 的新文件。

3.    加密 key.bin 文件,让用户无法访问该文件,除非他们可以使用 AWS CLI 命令 rm 解密文件 enc.key.bin,如下所示:

$ rm key.bin && rm FILE_TO_ENCRYPT

注意:您还可以选择删除要加密的原始文件,让用户无法访问该文件。

现在有以下内容:

  • FILE_TO_ENCRYPT.enc 中的加密数据。
  • 加密的 AES 256 位密钥 enc.key.bin
  • AWS KMS 公有密钥 RSAPublic.bin

注意:拥有加密数据的用户必须将这些文件发送给您进行解密。

解密发送给您的文件

要检索加密的数据,请解密 AES 256 位密钥,然后使用该密钥解密数据文件 FILE_TO_ENCRYPT.enc

注意:您必须有权访问 AWS KMS API,因为 AWS KMS 私有密钥无法以纯文本形式查看。

1.    解密 AES 256 位密钥,然后使用 AWS CLI 命令 decryptenc.key.bin 文件提交到 AWS KMS API,如下所示:

$ aws kms decrypt --key-id arn:aws:kms:eu-west-1:123456789012:key/d74f5077-811b-4447-af65-71f5f64f37d3 --ciphertext-blob fileb://enc.key.bin --encryption-algorithm RSAES_OAEP_SHA_256 --output text --query 'Plaintext' | base64 --decode > decryptedKey.bin
注意: --query 函数选择纯文本,然后将 base64 值解码为 decryptedKey.bin 文件。

2.    使用 decryptedKey.bin 文件运行 OpenSSL enc 命令以输出到 DECRYPTED_FILE,如下所示:

$ openssl enc -d -aes-256-cbc -pbkdf2 -in FILE_TO_ENCRYPT.enc -out DECRYPTED_FILE -pass file:./decryptedKey.bin

注意:将值 DECRYPTED_FILE 替换为要解密的文件的名称。

您可以比较 DECRYPTED_FILE 和 FILE_TO_ENCRYPT,以确保加密和解密成功完成。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?