當您的自建應用程序需要加密大量數據或者您不希望上傳數據到阿里云密鑰管理服務KMS(Key Management Service)時,可以使用信封加密。本文介紹如何使用KMS實現對數據的信封加密。
適用的密鑰類型
軟件密鑰、硬件密鑰。
軟件密鑰、硬件密鑰、默認密鑰中的服務密鑰和主密鑰均可進行信封加密,但默認密鑰中的服務密鑰和主密鑰僅用于云產品服務端加密,不能用于用戶自建應用加密,軟件密鑰、硬件密鑰不僅可用于云產品服務端加密,也可用于用戶自建應用加密。
本文僅介紹用戶自建應用進行信封加密的場景,關于云產品服務端加密,請參見云產品集成KMS加密概述。
什么是信封加密
KMS信封加密是類似數字信封技術的一種加密手段。使用KMS信封加密時,KMS為您生成數據密鑰并使用您的KMS密鑰對數據密鑰進行加密,然后將數據密鑰明文和密文安全地傳遞給您的應用程序。您的應用程序使用數據密鑰明文來加密數據,并將數據密文和數據密鑰密文存儲起來。解密數據時,應用程序首先請求KMS對數據密鑰密文解密得到數據密鑰明文,然后使用數據密鑰明文對數據密文解密。
信封加密流程
應用程序通過KMS實例SDK調用GenerateDataKey接口生成數據密鑰,然后通過第三方密碼算法庫或密碼模塊產品使用數據密鑰對數據進行加密,最后將數據密鑰密文作為信封和數據密文組裝在一起。具體流程見下圖。
應用程序調用GenerateDataKey接口,傳入如下信息用于生成數據密鑰。
KeyId:您創建的密鑰的KeyId或別名。
NumberOfBytes:數據密鑰的長度。從安全角度考慮,推薦您設置為24字節及以上長度。
說明常用的對稱加密算法中,AES算法加密需要16字節、24字節或32字節的數據密鑰,3DES算法加密需要16字節或24字節的數據密鑰,SM4算法加密需要16字節的數據密鑰。
應用程序收到KMS返回的數據密鑰,其中包含數據密鑰明文、數據密鑰密文、加密參數(包含加密算法以及加密后的初始向量IV)。
數據密鑰密文是由GenerateDataKey接口中傳入的密鑰加密數據密鑰明文生成的,其中加密模式為GCM。
應用程序使用數據密鑰明文在本地對數據進行加密得到數據密文。
重要使用數據密鑰明文在本地對數據進行加密、解密時,您可根據應用程序語言的適用性、安全合規方面的要求自主選擇第三方密碼算法庫或密碼模塊產品。
使用數據密鑰明文加密完成后,請您及時將數據密鑰明文銷毀。
應用程序將數據密文、數據密鑰密文、KMS的密鑰(即用于生成數據密鑰的密鑰)和加密參數(包含生成數據密鑰時的加密算法以及IV)進行保存。
信封解密流程
應用程序通過KMS實例SDK調用Decrypt接口解密數據密鑰密文,得到數據密鑰明文,然后通過第三方密碼算法庫或密碼模塊產品使用數據密鑰明文對數據密文進行解密,得到數據明文。具體流程見下圖。
應用程序讀取數據密文、數據密鑰密文、KMS的密鑰(即加密數據密鑰的密鑰)和加密參數(包含生成數據密鑰時的加密算法以及IV)。
應用程序調用KMS的Decrypt接口并傳入上一步讀取的信息,用于解密數據密鑰密文。
應用程序收到KMS返回的數據密鑰明文。
應用程序使用數據密鑰明文在本地對數據密文進行解密,得到數據明文。
應用場景
典型場景包括(但不限于):
用戶自建應用程序加密多個業務數據文件,且每個數據文件需要使用不同的數據密鑰。
需要加密多份數據文件且數據量很大時,如果使用單個或少量密鑰直接加密這些數據,會增加密鑰被破解的風險。通過采用KMS信封加密技術,分別使用新生成的數據密鑰來加密各份數據,僅使用您在KMS中的密鑰來加密數據密鑰,很大程度提升加密方案安全性。
用戶自建應用程序單次加密大量數據,例如:全磁盤數據。
單次加密數據量巨大時,如果由業務應用服務器通過網絡安全信道傳遞到KMS,由KMS加密后再返回給用戶,大量的數據網絡傳輸會帶來較高的成本和延時,使用信封加密可以解決這些問題。
使用限制
用戶自建應用程序通過KMS進行信封加密時,僅可使用軟件密鑰管理實例或硬件密鑰管理實例中的對稱密鑰,可選擇的密鑰規格如下。
軟件密鑰管理實例:Aliyun_AES_256。
硬件密鑰管理實例:Aliyun_AES_256、Aliyun_AES_192、Aliyun_AES_128或Aliyun_SM4。
準備工作
已創建應用接入點AAP。具體操作,請參見創建應用接入點。
已安裝KMS實例SDK。具體操作,請參見KMS實例SDK for Java、KMS實例SDK for PHP、KMS實例SDK for Go或KMS實例SDK for Python。
應用開發示例
示例代碼中數據密鑰采用32字節(256位)的AES密鑰,且對數據進行加密時采用GCM加密模式。
Java
示例中使用SunJCE Provider密碼庫對數據加密、解密 。
信封加密,請參見信封加密示例代碼。
信封解密,請參見信封解密示例代碼。
Python
示例中使用cryptography.hazmat密碼庫對數據加密、解密。
信封加密和解密,請參見信封加密和解密示例代碼。
Go
示例中使用golang/crypto密碼庫對數據加密、解密。
信封加密和解密,請參見信封加密和解密示例代碼。
PHP
示例中使用OpenSSL密碼庫對數據加密、解密。
信封加密和解密,請參見信封加密和解密示例代碼。