信封加密原理
信封加密应用对称加密 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 算法加密的。
信封加密的加密过程
- 生成 AES 明文密钥
- 应用 AES 明文密钥加密数据
- 应用 RSA 公钥加密 AES 明文密钥,失去密文密钥
- 密文密钥与加密数据一并存储,这两者形象比喻为装到信封里
信封加密的解密过程
- 数据接收者接管到信封,外面蕴含密文数据与
- 应用 RSA 私钥解密 AES 密文密钥,失去明文密钥
- 应用 AES 明文密钥解密密文数据
私有云 KMS 服务
信封加密的要害是加密对称密钥的 RSA Key,RSA Key 须要主密钥治理、数据加密密钥治理、有访问控制、拜访审计日志、Key 轮换更新的性能。
以后各大公有云厂商都提供密钥治理服务,并且与云服务器对接集成,如对象存储服务能够应用 KMS 加密数据,RDS 能够应用 KMS 加密硬盘数据。
- 主密钥治理:创立新的主密钥、从已有密钥导入到 KMS、主密钥轮换更新(加密的数据密钥中记录了应用哪个主密钥加密,主密钥轮换更新后之前的密钥还存在)、密钥访问控制、拜访审计日志。
- 数据加密密钥治理:创立、加密、解密。
- 云服务对接:对象存储、云硬盘、数据库等。
应用自定义密钥资料作为根密钥
企业个别会存在曾经在应用的 AES 加密密钥,如线上线下数据交换,存在一方加密数据在另一方解密,要求密钥统一。因而须要在创立主加密密钥的时候,导入已有的密钥资料创立。
应用已有密钥资料导入到 KMS 创立主密钥的流程为:从 KMS 服务下载 RSA 公钥(用于加密主密钥资料)、指定 RSA 填充算法、用 RSA 公钥 +RSA 算法加密密钥资料、导入到 KMS。
能够参考华为云 KMS 导入主密钥的帮忙文档,上面是参考帮忙文档的操作实例。
- 从 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
- 生成 256 位的 AES 密钥资料
AES 密钥长度为 256 bits,应用 openssl 生成密钥资料
openssl rand -out plain-text-key-material.bin 32
- 应用 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
- 将 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