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这个工具包,可以进行的操作是加密和解密数据。
环境配置
- 配置账户信息
注册 AWS 并创建 IAM 用户
设置用于开发的 AWS 凭证和区域
- 导入依赖
<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>