1. 程式人生 > 實用技巧 >使用AWS KMS加密本地資料

使用AWS KMS加密本地資料

AWS KMS 簡介及入門

快速入門

我們的目的是什麼?

我們的目的是,把本地的資料,經過加密進行傳輸和儲存;加密資料需要的資源有:加密演算法、金鑰、需要加密的資料;工作方式是需要加密的資料(被稱作明文)經過某種演算法後,生成新的程式碼串(被稱作密文),這個演算法執行的過程需要金鑰。加密每一條資料都需要一把鎖和對應的鑰匙,這裡的“鎖”可以理解為加密演算法,“鑰匙”即為加密演算法所需的金鑰。
因為我們需要加密的資料有很多條,所以就需要很多套鎖和鑰匙,在這裡我們不妨假設“買鑰匙送鎖”,不去過多關注鎖(即加密演算法)的原理,而把注意力放在如何儲存茫茫多的鑰匙,以及需要解鎖資料檔案的時候,如何找到對應的鑰匙。
KMS(Key Management Service)的功能就是,管理這些金鑰,在需要加密和解密的時候可以找到金鑰,對資料進行加鎖和解鎖。

AWS KMS介紹

AWS是指亞馬遜的雲服務,具體服務項包括雲資料庫、雲端計算、雲端儲存等;現在有很多雲服務提供商,國內比如騰訊阿里都有自己的雲服務。
KMS是指的Key Management Service,是一個金鑰管理服務,用於建立並管理金鑰,可以直接在AWS的官方賬戶管理控制檯中用視覺化介面操作,也提供官方Api(CLI)通過程式碼的形式進行管理,還提供支援第三方語言(比如Java)的Api。
KMS提供的Api僅僅是用來管理金鑰的,比如生成、檢視、編輯、標記金鑰,並不能實現使用金鑰加密資料這個步驟,要想實現此步驟,還需要藉助AWS官方提供的SDK,該SDK是面向整個AWS服務的,這裡只介紹和KMS相關的內容和介面。

重要概念介紹

客戶主金鑰(CMK)

前面提到了,我們需要加密很多資料,所以有很多鑰匙,可以把用於加密業務資料的鑰匙叫做“資料金鑰”,但是鑰匙直接放在表面上總歸是不安全的,因為鑰匙本身也是一段資料,所以我們可以對鑰匙也進行加密,加密“資料金鑰”同樣需要加密演算法和它對應的金鑰,這個金鑰就是“客戶主金鑰(CMK)”,CMK並不參與業務資料的加密,它知識管理“資料金鑰”的鑰匙。
CMK分類為“客戶託管CMK”、“AWS託管CMK”和“AWS擁有的CMK”,後兩類通常用於加密AWS賬戶內相關的資訊,並且使用者對它們只有部分許可權。我們使用KMS的主要目的並不是管理AWS賬戶,而是藉助它的管理功能管理自己的“資料金鑰”,所以後文討論的CMK預設指“客戶託管CMK”。
CMK的功能有:

  • 建立資料金鑰(對稱加密演算法需要的金鑰)
  • 建立資料金鑰對(非對稱加密演算法需要的金鑰)
  • 加密資料密匙
  • 檢視金鑰識別符號(KeyId,ARN等)
  • 設定密匙源材料
  • 加密上下文(加密的時候順帶儲存一些明文資訊Context)

信封加密

加密的資料的安全性部分取決於如何保護可解密該資料的資料金鑰。保護資料金鑰的一種公認的最佳實踐是對其進行加密。為此,您需要使用另一個加密金鑰(稱為主金鑰 )。這種使用對資料金鑰進行加密的做法稱為信封加密。
“AWS加密SDK”使用信封加密。它使用資料金鑰加密您的資料。然後,它使用對資料金鑰進行加密。AWS 加密 SDK在單個加密的訊息中返回加密的資料和加密的資料金鑰,如下圖所示。

資料金鑰對

根據加密演算法不同,金鑰有兩種,一種是加密和解密使用相同的金鑰,此類演算法被稱作“對稱加密”,金鑰也就只有一個;
另外一種加密演算法“非對稱加密”,通常有兩個金鑰,稱為“公鑰”和“私鑰”,它們兩個必需配對使用,否則不能開啟加密檔案,這兩個鑰匙就被成為“資料金鑰對”。
業務中使用的資料加密演算法均為對稱加密,故對資料密匙對的屬性以及設定方法不再詳細說明。

金鑰識別符號

使用KMS服務是需要具有賬戶憑證的,不可以離線使用,密匙識別符號可以簡單的理解為AWS用於識別使用者身份資訊的程式碼串,被稱作Keyid。
同樣的,也有一串編碼,記錄了不僅使用者資訊,還包括地區等資訊,叫做ARN。
這些標識身份的程式碼串可以通過AWS管理平臺或者程式Api獲取和管理。

金鑰源材料

類似於生成隨機數的Random方法需要一個種子,生成金鑰也需要一個種子,被叫做材料源。AWS賬戶會預設生成,使用者也可以自行設定。
公司業務中使用預設材料源即可。

開始使用

操作可以分為兩類,分別是操作主金鑰和操作資料金鑰,兩類操作涉及到的介面是不同的。
操作主金鑰需要用AWS官方的介面,匯入的Maven依賴為aws-java-sdk,可以進行的操作為上文中提到的CMK操作。
操作資料金鑰可以使用OpenSSL或者AWS官方提供的aws-encryption-sdk-java這個工具包,可以進行的操作是加密和解密資料。

環境配置

  1. 配置賬戶資訊

註冊 AWS 並建立 IAM 使用者
設定用於開發的 AWS 憑證和區域

  1. 匯入依賴
 <dependency>
		<groupId>com.amazonaws</groupId>
		<artifactId>aws-java-sdk</artifactId>
		<version>1.11.821</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
	<dependency>
		<groupId>org.bouncycastle</groupId>
		<artifactId>bcprov-jdk15on</artifactId>
		<version>1.60</version>
	</dependency>
	<dependency>
		<groupId>com.amazonaws</groupId>
		<artifactId>aws-encryption-sdk-java</artifactId>
		<version>1.6.1</version>
	</dependency>

常用功能及對應api

主金鑰管理
資料加密