乐趣区

关于云计算:信封加密与密钥管理实践

信封加密原理

信封加密应用对称加密 AES+ 非对称加密 RSA 两种实现,应用 RSA 加密 AES 算法的 Key,并将 Key 与一并存储或传输,密文 + 加密的 AES Key 就形象比喻为信封。

信封加密用于加密大量数据的场景,因为 RSA 加密的长度不容许超过 RSA Key 长度(通常 RSA Key 长度为 1024/2048/4096 bit),因而对于大文件加密的场景,如图片 / 视频 / 文本等,须要应用对称加密算法。对称加密算法的 Key 在网路或组织之间传输存在泄露危险,因而应用 RSA 非对称算法加密对称密钥的 Key,能够保障 Key 的平安传输。<!–more–>

信封加密实际上在 SSL 协定中就有应用,SSL 协定在替换公钥之后,最终会协商一个 AES 加密的 Key,这个 Key 在单方之间传输时候是应用 RSA 算法加密的。

信封加密的加密过程

  1. 生成 AES 明文密钥
  2. 应用 AES 明文密钥加密数据
  3. 应用 RSA 公钥加密 AES 明文密钥,失去密文密钥
  4. 密文密钥与加密数据一并存储,这两者形象比喻为装到信封里

信封加密的解密过程

  1. 数据接收者接管到信封,外面蕴含密文数据与
  2. 应用 RSA 私钥解密 AES 密文密钥,失去明文密钥
  3. 应用 AES 明文密钥解密密文数据

私有云 KMS 服务

信封加密的要害是加密对称密钥的 RSA Key,RSA Key 须要主密钥治理、数据加密密钥治理、有访问控制、拜访审计日志、Key 轮换更新的性能。
以后各大公有云厂商都提供密钥治理服务,并且与云服务器对接集成,如对象存储服务能够应用 KMS 加密数据,RDS 能够应用 KMS 加密硬盘数据。

  • 主密钥治理:创立新的主密钥、从已有密钥导入到 KMS、主密钥轮换更新(加密的数据密钥中记录了应用哪个主密钥加密,主密钥轮换更新后之前的密钥还存在)、密钥访问控制、拜访审计日志。
  • 数据加密密钥治理:创立、加密、解密。
  • 云服务对接:对象存储、云硬盘、数据库等。

应用自定义密钥资料作为根密钥

企业个别会存在曾经在应用的 AES 加密密钥,如线上线下数据交换,存在一方加密数据在另一方解密,要求密钥统一。因而须要在创立主加密密钥的时候,导入已有的密钥资料创立。
应用已有密钥资料导入到 KMS 创立主密钥的流程为:从 KMS 服务下载 RSA 公钥(用于加密主密钥资料)、指定 RSA 填充算法、用 RSA 公钥 +RSA 算法加密密钥资料、导入到 KMS。

能够参考华为云 KMS 导入主密钥的帮忙文档,上面是参考帮忙文档的操作实例。

  1. 从 KMS 服务下载 RSA 公钥,并抉择 RSA 填充算法

华为云下载加密 AES 密钥资料所需的内容为三个文件:

drwxr-xr-x 1 user01 1049089    0 4 月  28 19:47 ./
drwxr-xr-x 1 user01 1049089    0 4 月  28 19:47 ../
-rw-r--r-- 1 user01 1049089 2236 4 月  28 19:46 importToken_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633
-rw-r--r-- 1 user01 1049089  302 4 月  28 19:46 README_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633.txt
-rw-r--r-- 1 user01 1049089  294 4 月  28 19:46 wrappingKey_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633
  • wrappingKey_密钥 ID_下载工夫:即包装密钥,用于加密密钥资料的包装密钥
  • importToken_密钥 ID_下载工夫:即导入令牌,KMS 导入密钥资料时须要应用
  • README_密钥 ID_下载工夫:即阐明文件,记录包装密钥序列号、密钥包装算法、包装密钥文件名称、令牌文件名称以及包装密钥和令牌的过期工夫

README 内容

$ cat README_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633.txt
Wrapping Key Spec: RSA_2048
Wrapping Algorithm: RSAES_OAEP_SHA_1
Wrapping Key File: wrappingKey_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633
Import Token File: importToken_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633
Wrapping Key and Import Token Expiration: 2019-04-29 11:46:33 UTC
  1. 生成 256 位的 AES 密钥资料

AES 密钥长度为 256 bits,应用 openssl 生成密钥资料

openssl rand -out plain-text-key-material.bin 32
  1. 应用 RSA 公钥并抉择填充算法加密 AES 密钥资料
 openssl pkeyutl -in plain-text-key-material.bin -inkey wrappingKey_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633 -out encrypted-key-material.bin -keyform der -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 
  1. 将 AES 密钥资料导入到 KMS

在私有云界面上操作导入。

应用导入的主密钥创立数据加密密钥并加解密数据

参考样例代码。

须要留神的是,在华为云上目前创立的数据密钥长度只能是 512 位,512 位密钥长度只能用于 AES-XTS 算法,此算法目前次要用于磁盘加密。

如果在利用里集成 KMS 的话,应用程序 AES 加密算法罕用的为 AES-CBC,密钥最长是 256 位,因而基于现状只能将 512 位的密钥截断,然而截断之后会带来一些列问题,如何保障各个团队之间截断规定统一?信封加密场景,是将截断后的密钥与密文数据一并存储还是截断前的?截断后密钥与 KMS 里保留的密钥不统一会不会导致未知问题?

目前阿里云能够反对创立数据加密密钥时候,指定密钥长度为 128 位或 256 位。

对于 RSA 填充

RSA 填充算法能保障语义平安,同一个明文每次加密进去的密文都是不同,填充算法是在明文中填充一些随机数达到这个成果。因为 RSA 加密要求密文长度不能大于 Key 长度,因而应用 P 填充算法之后,对原始密文长度限度也有所变动。

以后次要有 3 种填充算法:RSA_PKCS1_PADDING/RSA_PKCS1_OAEP_PADDING/RSA_NO_PADDING

RSA_PKCS1_PADDING 最罕用的模式

输出:必须 比 RSA 钥模长 (modulus) 短至多 11 个字节, 也就是 RSA_size(rsa) – 11,如果输出的明文过长,必须切割,而后填充
输入:和 modulus 一样长

依据这个要求,对于 512bit 的密钥,block length = 512/8 – 11 = 53 字节

RSA_PKCS1_OAEP_PADDING

输出:RSA_size(rsa) – 41
输入:和 modulus 一样长

RSA_NO_PADDING 不填充

输出:能够和 RSA 钥模长一样长,如果输出的明文过长,必须切割,而后填充
输入:和 modulus 一样长

Reference

PKCS#1 V2

RAS 算法原理一

RAS 算法原理二

RSA 加密演算法

Padding&Text-book-rsa

Java AES and using my own Key

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download

Java 罕用加密算法应用与整顿
更多云最佳实际 https://best.practices.cloud

退出移动版