信封加密原理

信封加密应用对称加密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.txtWrapping Key Spec: RSA_2048Wrapping Algorithm: RSAES_OAEP_SHA_1Wrapping Key File: wrappingKey_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633Import Token File: importToken_d4a19541-800d-4a6c-9678-c9c7d7249887_20190428114633Wrapping 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