信封加密與密鑰管理實踐

信封加密原理

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

信封加密的加密過程

  1. 生成AES明文密鑰
  2. 使用AES明文密鑰加密數據
  3. 使用RSA公鑰加密AES明文密鑰,獲得密文密鑰
  4. 密文密鑰與加密數據一併存儲,這二者形象比喻爲裝到信封裏

信封加密的解密過程

  1. 數據接收者接收到信封,裏面包含密文數據與
  2. 使用RSA私鑰解密AES密文密鑰,獲得明文密鑰
  3. 使用AES明文密鑰解密密文數據

公有云 KMS 服務

信封加密的關鍵是加密對稱密鑰的RSA Key,RSA Key須要主密鑰管理、數據加密密鑰管理、有訪問控制、訪問審計日誌、Key輪換更新的功能。
當前各大公有云廠商都提供密鑰管理服務,而且與雲服務器對接集成,如對象存儲服務可使用KMS加密數據,RDS可使用KMS加密硬盤數據。github

  • 主密鑰管理:建立新的主密鑰、從已有密鑰導入到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生成密鑰材料oracle

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

在公有云界面上操做導入。app

使用導入的主密鑰建立數據加密密鑰並加解密數據

參考樣例代碼

須要注意的是,在華爲雲上目前建立的數據密鑰長度只能是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

相關文章
相關標籤/搜索