信封加密使用对称加密AES+非对称加密RSA两种实现,使用RSA加密AES算法的Key,并将Key与一并存储或传输,密文+加密的AES Key就形象比喻为信封。html
信封加密用于加密大量数据的场景,因为RSA加密的长度不容许超过RSA Key长度(一般RSA Key长度为1024/2048/4096 bit),所以对于大文件加密的场景,如图片/视频/文本等,须要使用对称加密算法。对称加密算法的Key在网路或组织之间传输存在泄露风险,所以使用RSA非对称算法加密对称密钥的Key,能够保证Key的安全传输。 <!--more-->java
信封加密实际上在SSL协议中就有使用,SSL协议在交换公钥以后,最终会协商一个AES加密的Key,这个Key在双方之间传输时候是使用RSA算法加密的。git
信封加密的关键是加密对称密钥的RSA Key,RSA Key须要主密钥管理、数据加密密钥管理、有访问控制、访问审计日志、Key轮换更新的功能。
当前各大公有云厂商都提供密钥管理服务,而且与云服务器对接集成,如对象存储服务可使用KMS加密数据,RDS可使用KMS加密硬盘数据。github
企业通常会存在已经在使用的AES加密密钥,如线上线下数据交换,存在一方加密数据在另外一方解密,要求密钥一致。所以须要在建立主加密密钥的时候,导入已有的密钥材料建立。
使用已有密钥材料导入到KMS建立主密钥的流程为:从KMS服务下载RSA公钥(用于加密主密钥材料)、指定RSA填充算法、用RSA公钥+RSA算法加密密钥材料、导入到KMS。算法
能够参考华为云KMS导入主密钥的帮助文档,下面是参考帮助文档的操做实例。数据库
华为云下载加密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
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
AES 密钥长度为256 bits,使用openssl生成密钥材料oracle
openssl rand -out plain-text-key-material.bin 32
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
在公有云界面上操做导入。app
参考样例代码。
须要注意的是,在华为云上目前建立的数据密钥长度只能是512位,512位密钥长度只能用于AES-XTS算法,此算法目前主要用于磁盘加密。
若是在应用里集成KMS的话,应用程序AES加密算法经常使用的为AES-CBC,密钥最长是256位,所以基于现状只能将512位的密钥截断,可是截断以后会带来一些列问题,如何保证各个团队之间截断规则一致?信封加密场景,是将截断后的密钥与密文数据一并存储仍是截断前的?截断后密钥与KMS里保存的密钥不一致会不会致使未知问题?
目前阿里云能够支持建立数据加密密钥时候,指定密钥长度为128位或256位。
RSA 填充算法能保证语义安全,同一个明文每次加密出来的密文都是不一样,填充算法是在明文中填充一些随机数达到这个效果。因为RSA加密要求密文长度不能大于Key长度,所以使用P填充算法以后,对原始密文长度限制也有所变化。
当前主要有3种填充算法:RSA_PKCS1_PADDING/RSA_PKCS1_OAEP_PADDING/RSA_NO_PADDING
输入:必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11,若是输入的明文过长,必须切割, 而后填充
输出:和modulus同样长
根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节
输入:RSA_size(rsa) – 41
输出:和modulus同样长
输入:能够和RSA钥模长同样长,若是输入的明文过长,必须切割,而后填充
输出:和modulus同样长
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download