您可以使用KMS輕松地創建密鑰,使用密鑰加密、解密業務數據,保護您的數據安全。本文介紹如何創建及使用密鑰。
概述
KMS提供默認密鑰、軟件密鑰和硬件密鑰三種密鑰管理類型,以滿足不同業務場景、安全與合規要求。更多詳細信息,請參見密鑰服務概述、密鑰管理類型和密鑰規格。
默認密鑰是KMS免費為用戶提供的功能,可供云產品服務端加密,比如和ECS結合使用。默認密鑰只提供對稱解密這一種加密方式,并且不支持客戶端數據加密。
軟件密鑰和默認密鑰一樣提供云產品服務端加密功能,除此之外也可用于構建應用層密碼技術方案,提供接口API用于客戶端數據加解密、數字簽名計算和驗證,支持對稱密鑰和非對稱密鑰,同時支持密鑰輪轉(自動更新密鑰),減少密鑰泄漏風險。
硬件密鑰和軟件密鑰一樣提供云產品服務端加密功能和構建應用層密碼技術方案,提供接口API用于客戶端數據加解密、數字簽名計算和驗證,支持對稱密鑰和非對稱密鑰,相對軟件密鑰支持的密鑰規格更多,同時會把密鑰存儲在密碼機中,滿足密碼法和FIPS國際的合規要求,但不支持密鑰輪轉。
密鑰管理為云產品加密
密鑰管理可供云產品服務端加密,比如和ECS結合使用,解決服務端數據明文傳輸的安全問題。支持該功能的密鑰類型:默認密鑰、軟件密鑰、硬件密鑰
使用示例
本文以ECS集成KMS默認主密鑰為例。關于云產品集成KMS的更多信息,請參見云產品集成KMS加密概述、支持集成KMS加密的云產品。
步驟一:啟用默認主密鑰
登錄密鑰管理服務控制臺,在頂部菜單欄選擇地域后,在左側導航欄單擊 。
在密鑰管理頁單擊默認密鑰,點擊主密鑰操作欄的啟用按鈕。為主密鑰取名alias/main。
您的默認密鑰中的主密鑰只能用于云產品服務端加密,不能用于您的客戶端數據加密。如果您有客戶端數據加密的訴求,請通過創建實例購買主密鑰(軟件)或者主密鑰(硬件)。
步驟二:ECS集成KMS默認密鑰
購買ECS產品時,在購買頁選擇使用創建的主密鑰alias/main加密服務端數據
步驟三:ECS使用KMS對數據進行密文傳輸
當有數據在ECS上傳輸時,ECS會默認調用KMS API對數據進行加解密處理,無需人工處理數據。通常云產品采用信封加密的機制實現對數據的加密,詳情請參見使用KMS密鑰進行信封加密。
密鑰管理構建應用層密碼技術方案
密鑰管理可用于構建應用層密碼技術方案,提供接口API用于客戶端數據加解密、數字簽名計算和驗證。支持該功能的密鑰類型:軟件密鑰、硬件密鑰。
前提條件
已購買并啟用KMS軟件/硬件密鑰管理實例。具體操作,請參見購買和啟用KMS實例。
使用示例
本文以使用軟件實例密鑰對應用層數據進行加密(AdvanceEncrypt)和解密(AdvanceDecrypt)為例。更多操作請參見使用KMS密鑰在線加密和解密數據。
步驟一:創建軟件密鑰
登錄密鑰管理服務控制臺,在頂部菜單欄選擇地域后,在左側導航欄單擊 。
進入用戶主密鑰頁面,點擊創建密鑰,根據提示完成配置。
KMS實例選擇之前購買的KMS軟件密鑰管理實例
密鑰類型選擇對稱加密。
密鑰規格選擇Aliyun_AES_256。
步驟二:依賴安裝
環境要求
已下載并安裝Java 8或以上版本。
驗證版本
打開終端,輸入
java -version
,查看Java(JDK)版本。在項目中添加Maven依賴,從Maven倉庫中自動下載Java安裝包。
訪問alibabacloud-dkms-gcs-java-sdk了解更多安裝信息和源代碼。
<dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-dkms-gcs-sdk</artifactId> <version>xx.xx.xx</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>tea</artifactId> <version>[1.2.3)</version> </dependency>
重要建議您安裝最新版本的SDK。
請使用com.aliyun.tea 1.2.3及以上版本。
步驟三:創建接口調用憑證
登錄密鑰管理服務控制臺,在頂部菜單欄選擇地域后,在左側導航欄單擊 。
在應用接入頁簽,單擊創建應用接入點,在創建應用接入點面板完成各項配置。
配置項
說明
創建模式
選擇快速創建。
作用域(KMS實例)
選擇應用要訪問的KMS實例。
應用接入點名稱
自定義應用接入點的名稱。
認證方式
默認為ClientKey,不支持修改。
默認權限策略
默認為
key/*
secret/*
,不支持修改。即應用可以訪問指定KMS實例中的所有密鑰和憑據。單擊確定,瀏覽器會自動下載ClientKey。
ClientKey包含應用身份憑證內容(ClientKeyContent)和憑證口令(ClientKeyPassword)。 應用身份憑證內容(ClientKeyContent)文件名默認為
clientKey_****.json
。憑證口令(ClientKeyPassword)文件名默認為clientKey_****_Password.txt
步驟四:下載KMS實例的CA證書
登錄密鑰管理服務控制臺,在頂部菜單欄選擇地域后,在左側導航欄單擊 。
在右側操作頁面上方,點擊CA證書下載。
步驟五:客戶端調用
初始化KMS實例SDK
public static void initClient() throws Exception { Config config = new Config(); config.setProtocol("https"); config.setEndpoint("實例id.cryptoservice.KMS.aliyuncs.com"); // 設置KMS實例Endpoint config.setClientKeyFile("<YOUR-CLIENT-KEY-FILE>"); // 設置client key文件地址 // config.setClientKeyContent("<YOUR-CLIENT-KEY-CONTENT>"); // 或設置client key文件的內容 config.setPassword("<YOUR-PASSWORD>"); // 設置client key 保護密碼 config.setCaFilePath("<path/to/yourCaCert>");// 設置KMS實例的CA證書,可通過文件路徑 //config.setCa("<your-ca-certificate-content"); // 或者設置服務端證書內容 client = new Client(config); }
調用AdvanceEncrypt加密數據
/** * KMS默認采用GCM加密模式。 * @param keyId keyId 參數,可使用密鑰Id或別名 * @param plaintext 需要加密的數據 * @param aad 用戶可根據使用的需要設置GCM加密模式的AAD參數。如果不需要使用,請設置為null或不設置。 * @return AdvanceEncrypt密文數據上下文(本示例采用AdvanceEncryptContext),包含密文數據(ciphertextBlob)和相關參數密文(AAD)。 */ private static AdvanceEncryptContext advanceEncryptSample(String keyId, byte[] plaintext, byte[] aad) { AdvanceEncryptRequest request = new AdvanceEncryptRequest(); request.setKeyId(keyId); request.setPlaintext(plaintext); request.setAad(aad); try { AdvanceEncryptResponse response = client.advanceEncrypt(request); return new AdvanceEncryptContext(response.getCiphertextBlob(), aad); } catch (TeaException e) { System.out.printf("code: %s%n", e.getCode()); System.out.printf("message: %s%n", e.getMessage()); System.out.printf("requestId: %s%n", e.getData().get("requestId")); e.printStackTrace(); throw new RuntimeException(e); } catch (Exception e) { System.out.printf("advance encrypt err: %s%n", e.getMessage()); e.printStackTrace(); throw new RuntimeException(e); } }
調用AdvanceDecrypt解密數據
/** * 調用 AdvanceDecrypt 的示例。 * * @param advanceEncryptContext AdvanceEncrypt密文數據上下文(本示例采用AdvanceEncryptContext),包含密文數據(ciphertextBlob)和相關參數密文(AAD)。 * @return 解密后得到的明文數據。 */ private static byte[] advanceDecryptSample(final AdvanceEncryptContext advanceEncryptContext) { // 構建高級解密請求對象 AdvanceDecryptRequest request = new AdvanceDecryptRequest(); request.setCiphertextBlob(advanceEncryptContext.getCiphertextBlob()); request.setAad(advanceEncryptContext.getAad()); try { AdvanceDecryptResponse response = client.advanceDecrypt(request); System.out.printf("RequestId: %s%n", response.getRequestId()); return response.getPlaintext(); } catch (TeaException e) { System.out.printf("code: %s%n", e.getCode()); System.out.printf("message: %s%n", e.getMessage()); System.out.printf("requestId: %s%n", e.getData().get("requestId")); e.printStackTrace(); throw new RuntimeException(e); } catch (Exception e) { System.out.printf("advance decrypt err: %s%n", e.getMessage()); e.printStackTrace(); throw new RuntimeException(e); } }