概述
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)版本。
安装SDK
在项目中添加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>
步骤三:创建接口调用凭证
登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击。
创建接入点
在应用接入页签,单击创建应用接入点,在创建应用接入点面板完成各项配置。
配置项 | 说明 |
创建模式 | 选择快速创建。 |
作用域(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);
}
}
完整代码样例参见AdvanceEncryptAdvanceDecryptSample.java