信封加密使用對稱加密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