密鑰管理快速入門
您可以使用KMS輕松地創(chuàng)建密鑰,使用密鑰加密、解密業(yè)務(wù)數(shù)據(jù),保護(hù)您的數(shù)據(jù)安全。本文介紹如何創(chuàng)建及使用密鑰。
概述
KMS提供默認(rèn)密鑰、軟件密鑰和硬件密鑰三種密鑰管理類型,以滿足不同業(yè)務(wù)場景、安全與合規(guī)要求。更多詳細(xì)信息,請(qǐng)參見密鑰服務(wù)概述、密鑰管理類型和密鑰規(guī)格。
默認(rèn)密鑰是KMS免費(fèi)為用戶提供的功能,可供云產(chǎn)品服務(wù)端加密,比如和ECS結(jié)合使用。默認(rèn)密鑰只提供對(duì)稱解密這一種加密方式,并且不支持客戶端數(shù)據(jù)加密。
軟件密鑰和默認(rèn)密鑰一樣提供云產(chǎn)品服務(wù)端加密功能,除此之外也可用于構(gòu)建應(yīng)用層密碼技術(shù)方案,提供接口API用于客戶端數(shù)據(jù)加解密、數(shù)字簽名計(jì)算和驗(yàn)證,支持對(duì)稱密鑰和非對(duì)稱密鑰,同時(shí)支持密鑰輪轉(zhuǎn)(自動(dòng)更新密鑰),減少密鑰泄漏風(fēng)險(xiǎn)。
硬件密鑰和軟件密鑰一樣提供云產(chǎn)品服務(wù)端加密功能和構(gòu)建應(yīng)用層密碼技術(shù)方案,提供接口API用于客戶端數(shù)據(jù)加解密、數(shù)字簽名計(jì)算和驗(yàn)證,支持對(duì)稱密鑰和非對(duì)稱密鑰,相對(duì)軟件密鑰支持的密鑰規(guī)格更多,同時(shí)會(huì)把密鑰存儲(chǔ)在密碼機(jī)中,滿足密碼法和FIPS國際的合規(guī)要求,但不支持密鑰輪轉(zhuǎn)。
密鑰管理為云產(chǎn)品加密
密鑰管理可供云產(chǎn)品服務(wù)端加密,比如和ECS結(jié)合使用,解決服務(wù)端數(shù)據(jù)明文傳輸?shù)陌踩珕栴}。支持該功能的密鑰類型:默認(rèn)密鑰、軟件密鑰、硬件密鑰
使用示例
本文以ECS集成KMS默認(rèn)主密鑰為例。關(guān)于云產(chǎn)品集成KMS的更多信息,請(qǐng)參見云產(chǎn)品集成KMS加密概述、支持集成KMS加密的云產(chǎn)品。
步驟一:啟用默認(rèn)主密鑰
登錄密鑰管理服務(wù)控制臺(tái),在頂部菜單欄選擇地域后,在左側(cè)導(dǎo)航欄單擊 。
在密鑰管理頁單擊默認(rèn)密鑰,點(diǎn)擊主密鑰操作欄的啟用按鈕。為主密鑰取名alias/main。
您的默認(rèn)密鑰中的主密鑰只能用于云產(chǎn)品服務(wù)端加密,不能用于您的客戶端數(shù)據(jù)加密。如果您有客戶端數(shù)據(jù)加密的訴求,請(qǐng)通過創(chuàng)建實(shí)例購買主密鑰(軟件)或者主密鑰(硬件)。
步驟二:ECS集成KMS默認(rèn)密鑰
購買ECS產(chǎn)品時(shí),在購買頁選擇使用創(chuàng)建的主密鑰alias/main加密服務(wù)端數(shù)據(jù)
步驟三:ECS使用KMS對(duì)數(shù)據(jù)進(jìn)行密文傳輸
當(dāng)有數(shù)據(jù)在ECS上傳輸時(shí),ECS會(huì)默認(rèn)調(diào)用KMS API對(duì)數(shù)據(jù)進(jìn)行加解密處理,無需人工處理數(shù)據(jù)。通常云產(chǎn)品采用信封加密的機(jī)制實(shí)現(xiàn)對(duì)數(shù)據(jù)的加密,詳情請(qǐng)參見使用KMS密鑰進(jìn)行信封加密。
密鑰管理構(gòu)建應(yīng)用層密碼技術(shù)方案
密鑰管理可用于構(gòu)建應(yīng)用層密碼技術(shù)方案,提供接口API用于客戶端數(shù)據(jù)加解密、數(shù)字簽名計(jì)算和驗(yàn)證。支持該功能的密鑰類型:軟件密鑰、硬件密鑰。
前提條件
已購買并啟用KMS軟件/硬件密鑰管理實(shí)例。具體操作,請(qǐng)參見購買和啟用KMS實(shí)例。
使用示例
本文以使用軟件實(shí)例密鑰對(duì)應(yīng)用層數(shù)據(jù)進(jìn)行加密(AdvanceEncrypt)和解密(AdvanceDecrypt)為例。更多操作請(qǐng)參見使用KMS密鑰在線加密和解密數(shù)據(jù)。
步驟一:創(chuàng)建軟件密鑰
登錄密鑰管理服務(wù)控制臺(tái),在頂部菜單欄選擇地域后,在左側(cè)導(dǎo)航欄單擊 。
進(jìn)入用戶主密鑰頁面,點(diǎn)擊創(chuàng)建密鑰,根據(jù)提示完成配置。
KMS實(shí)例選擇之前購買的KMS軟件密鑰管理實(shí)例
密鑰類型選擇對(duì)稱加密。
密鑰規(guī)格選擇Aliyun_AES_256。
步驟二:依賴安裝
環(huán)境要求
已下載并安裝Java 8或以上版本。
驗(yàn)證版本
打開終端,輸入
java -version
,查看Java(JDK)版本。在項(xiàng)目中添加Maven依賴,從Maven倉庫中自動(dòng)下載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。
請(qǐng)使用com.aliyun.tea 1.2.3及以上版本。
步驟三:創(chuàng)建接口調(diào)用憑證
登錄密鑰管理服務(wù)控制臺(tái),在頂部菜單欄選擇地域后,在左側(cè)導(dǎo)航欄單擊 。
在應(yīng)用接入頁簽,單擊創(chuàng)建應(yīng)用接入點(diǎn),在創(chuàng)建應(yīng)用接入點(diǎn)面板完成各項(xiàng)配置。
配置項(xiàng)
說明
創(chuàng)建模式
選擇快速創(chuàng)建。
作用域(KMS實(shí)例)
選擇應(yīng)用要訪問的KMS實(shí)例。
應(yīng)用接入點(diǎn)名稱
自定義應(yīng)用接入點(diǎn)的名稱。
認(rèn)證方式
默認(rèn)為ClientKey,不支持修改。
默認(rèn)權(quán)限策略
默認(rèn)為
key/*
secret/*
,不支持修改。即應(yīng)用可以訪問指定KMS實(shí)例中的所有密鑰和憑據(jù)。單擊確定,瀏覽器會(huì)自動(dòng)下載ClientKey。
ClientKey包含應(yīng)用身份憑證內(nèi)容(ClientKeyContent)和憑證口令(ClientKeyPassword)。 應(yīng)用身份憑證內(nèi)容(ClientKeyContent)文件名默認(rèn)為
clientKey_****.json
。憑證口令(ClientKeyPassword)文件名默認(rèn)為clientKey_****_Password.txt
步驟四:下載KMS實(shí)例的CA證書
登錄密鑰管理服務(wù)控制臺(tái),在頂部菜單欄選擇地域后,在左側(cè)導(dǎo)航欄單擊 。
在右側(cè)操作頁面上方,點(diǎn)擊CA證書下載。
步驟五:客戶端調(diào)用
初始化KMS實(shí)例SDK
public static void initClient() throws Exception { Config config = new Config(); config.setProtocol("https"); config.setEndpoint("實(shí)例id.cryptoservice.KMS.aliyuncs.com"); // 設(shè)置KMS實(shí)例Endpoint config.setClientKeyFile("<YOUR-CLIENT-KEY-FILE>"); // 設(shè)置client key文件地址 // config.setClientKeyContent("<YOUR-CLIENT-KEY-CONTENT>"); // 或設(shè)置client key文件的內(nèi)容 config.setPassword("<YOUR-PASSWORD>"); // 設(shè)置client key 保護(hù)密碼 config.setCaFilePath("<path/to/yourCaCert>");// 設(shè)置KMS實(shí)例的CA證書,可通過文件路徑 //config.setCa("<your-ca-certificate-content"); // 或者設(shè)置服務(wù)端證書內(nèi)容 client = new Client(config); }
調(diào)用AdvanceEncrypt加密數(shù)據(jù)
/** * KMS默認(rèn)采用GCM加密模式。 * @param keyId keyId 參數(shù),可使用密鑰Id或別名 * @param plaintext 需要加密的數(shù)據(jù) * @param aad 用戶可根據(jù)使用的需要設(shè)置GCM加密模式的AAD參數(shù)。如果不需要使用,請(qǐng)?jiān)O(shè)置為null或不設(shè)置。 * @return AdvanceEncrypt密文數(shù)據(jù)上下文(本示例采用AdvanceEncryptContext),包含密文數(shù)據(jù)(ciphertextBlob)和相關(guān)參數(shù)密文(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); } }
調(diào)用AdvanceDecrypt解密數(shù)據(jù)
/** * 調(diào)用 AdvanceDecrypt 的示例。 * * @param advanceEncryptContext AdvanceEncrypt密文數(shù)據(jù)上下文(本示例采用AdvanceEncryptContext),包含密文數(shù)據(jù)(ciphertextBlob)和相關(guān)參數(shù)密文(AAD)。 * @return 解密后得到的明文數(shù)據(jù)。 */ private static byte[] advanceDecryptSample(final AdvanceEncryptContext advanceEncryptContext) { // 構(gòu)建高級(jí)解密請(qǐng)求對(duì)象 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); } }