密钥管理快速入门

您可以使用KMS轻松地创建密钥,使用密钥加密、解密业务数据,保护您的数据安全。本文介绍如何创建及使用密钥。

概述

KMS提供默认密钥、软件密钥和硬件密钥三种密钥管理类型,以满足不同业务场景、安全与合规要求。更多详细信息,请参见密钥服务概述密钥管理类型和密钥规格

  • 默认密钥是KMS免费为用户提供的功能,可供云产品服务端加密,比如和ECS结合使用。默认密钥只提供对称解密这一种加密方式,并且不支持客户端数据加密。

  • 软件密钥和默认密钥一样提供云产品服务端加密功能,除此之外也可用于构建应用层密码技术方案,提供接口API用于客户端数据加解密、数字签名计算和验证,支持对称密钥和非对称密钥,同时支持密钥轮转(自动更新密钥),减少密钥泄漏风险。

  • 硬件密钥和软件密钥一样提供云产品服务端加密功能和构建应用层密码技术方案,提供接口API用于客户端数据加解密、数字签名计算和验证,支持对称密钥和非对称密钥,相对软件密钥支持的密钥规格更多,同时会把密钥存储在密码机中,满足密码法和FIPS国际的合规要求,但不支持密钥轮转

密钥管理为云产品加密

密钥管理可供云产品服务端加密,比如和ECS结合使用,解决服务端数据明文传输的安全问题。支持该功能的密钥类型:默认密钥、软件密钥、硬件密钥

使用示例

本文以ECS集成KMS默认主密钥为例。关于云产品集成KMS的更多信息,请参见云产品集成KMS加密概述支持集成KMS加密的云产品

步骤一:启用默认主密钥

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 密钥管理

  2. 在密钥管理页单击默认密钥,点击主密钥操作栏的启用按钮。为主密钥取名alias/mainimage

说明

您的默认密钥中的主密钥只能用于云产品服务端加密,不能用于您的客户端数据加密。如果您有客户端数据加密的诉求,请通过创建实例购买主密钥(软件)或者主密钥(硬件)。

步骤二:ECS集成KMS默认密钥

购买ECS产品时,在购买页选择使用创建的主密钥alias/main加密服务端数据

image

步骤三:ECS使用KMS对数据进行密文传输

当有数据在ECS上传输时,ECS会默认调用KMS API对数据进行加解密处理,无需人工处理数据。通常云产品采用信封加密的机制实现对数据的加密,详情请参见使用KMS密钥进行信封加密

密钥管理构建应用层密码技术方案

密钥管理可用于构建应用层密码技术方案,提供接口API用于客户端数据加解密、数字签名计算和验证。支持该功能的密钥类型:软件密钥、硬件密钥

前提条件

已购买并启用KMS软件/硬件密钥管理实例。具体操作,请参见购买和启用KMS实例

使用示例

本文以使用软件实例密钥对应用层数据进行加密(Encrypt)和解密(Decrypt)为例。更多操作请参见使用KMS密钥在线加密和解密数据

步骤一:创建软件密钥

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 密钥管理

  2. 进入用户主密钥页签,单击创建密钥,根据提示完成配置。

    • KMS实例选择之前购买的KMS软件密钥管理实例。

    • 密钥类型选择对称加密。

    • 密钥规格选择Aliyun_AES_256。image

步骤二:依赖安装

  1. 环境准备

    环境要求

    已下载并安装Java 8或以上版本。

    验证版本

    打开终端,输入java -version,查看Java(JDK)版本。

  2. 安装SDK

    在项目中添加Maven依赖,从Maven仓库中自动下载Java安装包。请使用阿里云SDK(V2.0)。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>kms20160120</artifactId>
      <version>1.2.3</version>
    </dependency>

步骤三:创建接口调用凭证

阿里云SDK支持基于RAM的多种认证方式,本文以使用RAM用户的AccessKey为例。更多认证方式的介绍,请参见管理访问凭据

  1. RAM控制台创建RAM用户的AccessKey。具体操作,请参见创建AccessKey

    如果您已有AccessKey,请跳过该步骤。image

  2. RAM用户设置合适的访问权限。

    例如,您希望该RAM用户仅能执行密码运算操作,可以授予其系统权限策略AliyunKMSCryptoUserAccess。具体操作,请参见RAM用户授权image

    说明

    KMS提供了两种设置访问权限的途径:

    • 基于身份的策略:上述示例即该方式,通过关联身份与相应的权限来控制访问。详细介绍,请参见使用RAM进行访问控制

    • 基于资源的策略:包含密钥策略、凭据策略,这些策略直接与资源相关联,用于定义对特定资源的访问规则。详细介绍,请参见密钥策略凭据策略

步骤四:获取KMS实例的CA证书

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 实例管理

  2. 在右侧操作页面上方,单击获取实例CA证书

    image

步骤五:获取实例VPC地址

在实例的详情页面,获取实例VPC地址。

image

步骤六:客户端调用

  1. 初始化阿里云SDK。

    重要

    请使用阿里云SDK(V2.0),Endpoint请填写实例VPC地址,同时需要设置实例CA证书。

        public static com.aliyun.kms20160120.Client createClient() throws Exception {
            // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Endpoint请输入实例VPC地址,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com
            config.endpoint = "<实例VPC地址>";
            // 请填写实例ca证书的内容
            config.ca = "<实例CA证书>";
            return new com.aliyun.kms20160120.Client(config);
        }
  2. 调用Encrypt加密数据。

    package com.aliyun.sample;
    
    import com.aliyun.tea.*;
    
    public class Sample {
      public static com.aliyun.kms20160120.Client createClient() throws Exception {
            // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Endpoint请输入实例VPC地址,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com
            config.endpoint = "<实例VPC地址>";
            // 请填写实例ca证书的内容
            config.ca = "<实例CA证书>";
            return new com.aliyun.kms20160120.Client(config);
        }
       
         public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.kms20160120.Client client = Sample.createClient();
            com.aliyun.kms20160120.models.EncryptRequest encryptRequest = new com.aliyun.kms20160120.models.EncryptRequest()
                    .setKeyId("<keyID>")
                    .setPlaintext("<PlaintText>");
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            try {
                // 复制代码运行请自行打印 API 的返回值
                client.encryptWithOptions(encryptRequest, runtime);
            } catch (TeaException error) {
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            }        
        }
    }
  3. 调用Decrypt解密数据。

    package com.aliyun.sample;
    
    import com.aliyun.tea.*;
    
    public class Sample {
    
        public static com.aliyun.kms20160120.Client createClient() throws Exception {
            // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Endpoint请输入实例VPC地址,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com
            config.endpoint = "<实例VPC地址>";
            // 请填写实例ca证书的内容
            config.ca = "<实例CA证书>";
            return new com.aliyun.kms20160120.Client(config);
        }
    
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.kms20160120.Client client = Sample.createClient();
            com.aliyun.kms20160120.models.DecryptRequest decryptRequest = new com.aliyun.kms20160120.models.DecryptRequest()
                    .setCiphertextBlob("<CiphertextBlob>");
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            try {
                // 复制代码运行请自行打印 API 的返回值
                client.decryptWithOptions(decryptRequest, runtime);
            } catch (TeaException error) {
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            }        
        }
    }

相关文档