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这个工具包,可以进行的操作是加密和解密数据。

环境配置

  1. 配置账户信息

注册 AWS 并创建 IAM 用户
设置用于开发的 AWS 凭证和区域

  1. 导入依赖
 <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>

常用功能及对应api

主密钥管理
数据加密

posted @ 2020-07-24 12:18 SunSky... 阅读(2317) 评论(0) 推荐(0)
摘要: 1.1基本类型只有八个: 整型- byte short int long 浮点型- float double 字符型- char 布尔型- boolean 1.2其中数字常量会被默认为int类型;byte,short和char类型的变量在赋值的时候若等号右边未超过范围则会自动进行强制类型转化 例:c 阅读全文
posted @ 2020-02-05 12:36 SunSky... 阅读(342) 评论(0) 推荐(0)
摘要: 终于过了。 题目:http://poj.org/problem?id=1191 dp,水平有限,想不清更新顺序,所以打的记忆化, f[n,x,y,xx,yy]表示还剩下n块,以及还剩下的这部分的左上角右下角坐标,所存储的最优值 需要对公式变形为n*σ*σ=Σ(xi-x )^2,维护的即为各项的和 代码: program sky;const maxn = 10000000;var ... 阅读全文
posted @ 2012-05-24 11:39 SunSky... 阅读(198) 评论(0) 推荐(0)
摘要: 题目描述 书的复制 现在要把maxn本有顺序的书分给n个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。 输入 第一行两个整数maxn, n;(n<=maxn<=100) 第二行maxn个整数,第i个整数表示第i... 阅读全文
posted @ 2012-05-18 16:56 SunSky... 阅读(386) 评论(0) 推荐(0)
摘要: A1098. 加法分解时间限制:1.0s 内存限制:256.0MB总提交次数:86 AC次数:30 平均分:44.88将本题分享到:查看未格式化的试题提交试题讨论问题描述 给一个正整数n,输出它所有的正整数加法的分解方法。 注意: 1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。 2. 不分解也视为一种分解方案。 3. 按字典序输出所有分解方案,格式见样例。输入格式 输入共1行,包含2个正整数n和m,之间用一个空格隔开。n表示待分解正整数,m是1或者2: 1表示交换加数的位置是否视为不同的分解方案; 2表示交换加数的位置是否视为相同的分解方案。输出格式 输出若干... 阅读全文
posted @ 2012-04-27 16:15 SunSky... 阅读(312) 评论(0) 推荐(0)
摘要: 树状数组解决lis(最长上升序列),nlogn用树状数组维护f数组小于等于i的最大值(前i位最值)用到离散化View Code 1 program sky; 2 var 3 c,a,f,b,s:array[0..50000] of longint; 4 i,j,n:longint; 5 ans,tot:longint; 6 function max(qq,ww:longint):longint; 7 begin 8 if qq>ww then exit(qq); exit(ww); 9 end;10 procedure swap(var qq,ww:longint);11 v... 阅读全文
posted @ 2012-04-13 06:35 SunSky... 阅读(232) 评论(0) 推荐(0)
摘要: 题目大意就是读入一个字符串,为一个加减法的表达式,例如'3215+3214-45+1=' 的形式,让你计算结果需要注意的是可能第一个字符是‘-’(负号),而且中间过程也可能出问题这就使得某些同学的打法会出问题,解决办法就是在前面加一个比较大的数,使计算过程中不会出现负数代码如下View Code 1 program sky; 2 const 3 maxn=100000; maxs='100000'; 4 var 5 s,ss:string; 6 tp,tpp,x,y,k:longint; 7 ch:char; 8 function min(qq,ww:longi 阅读全文
posted @ 2012-04-08 19:04 SunSky... 阅读(170) 评论(0) 推荐(0)
摘要: 题目描述问题描述 求出区间[a,b]中所有整数的质因数分解。输入格式 输入两个整数a,b。输出格式 每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)样例输入3 10样例输出3=34=2*25=56=2*37=78=2*2*29=3*310=2*5提示 先筛出所有素数,然后再分解。数据规模和约定 2<=a<=b<=10000View Code 1 program sky; 2 var 3 l,r,i,tot,j,k:longint; 4 tp:longint; 5 a:array[0..10000] 阅读全文
posted @ 2012-04-08 10:10 SunSky... 阅读(222) 评论(0) 推荐(0)
摘要: 题目描述 差为2的两个素数被称为孪生素数对,例如3和5, 11和13. 给定一个区间,请输出区间内所有的孪生素数对.输入格式 两个正整数a,b,其中a<b,以空格分开输出格式 区间[a,b]内的所有孪生素数对,按从小到大顺序。每行一个素数对,其中小的在前,大的在后,以空格分开。 如果区间内没有素数对的话,输出-1.样例输入2 15样例输出3 55 711 13样例输入14 18样例输出-1http://www.cnblogs.com/skysun很水的一道题,暴力可以过(直接从2到sqrt(n)来判断n是不是素数)但是我不是只想过一道题而已学习了一下非递归的二分,复习了一遍打表非递归.. 阅读全文
posted @ 2012-04-08 07:57 SunSky... 阅读(296) 评论(0) 推荐(0)
摘要: 题目描述问题描述有一长度为N(1<=N<=10)的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。要将这个长度为N的地板铺满,并且要求长度为1的瓷砖不能相邻,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?例如,长度为4的地面一共有如下4种铺法,并且,一共用了长度为1的瓷砖4块:4=1+2+14=1+34=2+24=3+1编程求解上述问题。输入格式只有一个数N,代表地板的长度输出格式第一行有一个数,代表所有不同的瓷砖铺放方法的总数。第二行也有一个数,代表这些铺法中长度为1的瓷砖的总数样例输入4样例输出44不解释了,很简单,只是 阅读全文
posted @ 2012-04-06 21:54 SunSky... 阅读(319) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示