文章目录
一. 数字加密算法
- 数字加密算法中,通常可划分为对称加密和非对称加密。
1. 对称加密
- 概念:加密和解密使用同一个密钥,所以叫做对称加密。
- 常见的对称加密算法:DES,AES。
2. 非对称加密
- 概念:加密和解密使用两个的密钥,一把作为公开的公钥(Public Key),另一把作为私钥(Private Key)。因为加密和解密使用的不是同一把密钥,所以这种算法称为非对称加密算法。
- 公钥和私钥成对存在,通常【公钥加密,私钥解密】;
- 公钥是基于私钥而存在的。通过私钥经过一系列算法是可以推导出公钥,但无法通过公钥反向推倒出私钥。
- 常见的非对称加密算法:RSA,ECC。
3. 对称加密和非对称加密的区别
- 对称加密:加解密效率高。但在非安全信道中通讯时,密钥交换的安全性不能保障。
- 非对称加密:加解密效率低,但可以保证密钥安全性。
- 通常在实际的网络环境中,会将两者混合使用。两者混合使用的示例如下:
二. 使用keytool生成证书
1. 创建证书
- 新建文件夹:/xxx/keytool_study
- 创建证书,并存放到密钥库中:使用
keytool
命令
zijikanwa-mac:keytool_study zijikanwa$ keytool -genkeypair -alias “test1” -keyalg “RSA” -keystore “test.keystore”
- 说明
- 两次输入密码时,第一次输入的是密钥库(keystore)的密码,第二次输入的是证书条目的密码
- 命令含义:创建一个别名为test1的证书条目,该条目存放在名为test.keystore的密钥库中,若test.keystore密钥库不存在则创建。
- 命令的参数说明:
- -genkeypair:生成一对非对称密钥;
- -alias:指定密钥对的别名,该别名是公开的;
- -keyalg:指定加密算法,本例中的采用通用的RAS加密算法;
- -keystore:密钥库的路径及名称。如果不指定,默认在操作系统的用户目录下生成一个".keystore"的文件
- 执行结果
zijikanwa-mac:keytool_study zijikanwa$ keytool -genkeypair -alias "test1" -keyalg "RSA" -keystore "test.keystore"
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: zijikanwa
您的组织单位名称是什么?
[Unknown]: alihealth.com
您的组织名称是什么?
[Unknown]: alihealth
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的省/市/自治区名称是什么?
[Unknown]: beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn是否正确?
[否]: y
输入 <test1> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
2. 查看密钥库
- 命令说明:查看名为test.keystore的密钥库中的证书条目
zijikanwa-mac:keytool_study zijikanwa$ keytool -list -keystore test.keystore
2.1 keytool -list
命令
zijikanwa-mac:keytool_study zijikanwa$ keytool -list -keystore test.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
test1, 2020-5-18, PrivateKeyEntry,
证书指纹 (SHA1): 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
2.2 keytool -list -v
命令
zijikanwa-mac:keytool_study zijikanwa$ keytool -list -v -keystore test.keystore
zijikanwa-mac:keytool_study zijikanwa$ keytool -list -v -keystore test.keystore
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: test1
创建日期: 2020-5-18
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
发布者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
序列号: 5a0e9666
有效期为 Mon May 18 14:53:09 CST 2020 至 Sun Aug 16 14:53:09 CST 2020
证书指纹:
MD5: 6B:2D:30:CA:D0:C9:22:6C:2E:88:6A:4D:02:E2:58:FB
SHA1: 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
SHA256: B9:20:43:76:D3:2A:17:BC:82:79:C5:CF:9F:56:49:E5:68:3E:75:9A:CF:0A:D5:A8:8C:AC:FD:54:3C:E0:AD:A5
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
3. 将密钥库中的证书条目导出到证书文件
zijikanwa-mac:keytool_study zijikanwa$ keytool -export -alias test1 -file test.crt -keystore test.keystore
命令含义:将名为test.keystore的证书库中别名为test1的证书条目导出到证书文件test.crt中
zijikanwa-mac:keytool_study zijikanwa$ keytool -export -alias test1 -file test.crt -keystore test.keystore
输入密钥库口令:
存储在文件 <test.crt> 中的证书
4. 查看证书文件test.crt的信息
zijikanwa-mac:keytool_study zijikanwa$ keytool -printcert -file “test.crt”
命令含义:查看证书文件test.crt的信息
zijikanwa-mac:keytool_study zijikanwa$ keytool -printcert -file "test.crt"
所有者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
发布者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
序列号: 5a0e9666
有效期为 Mon May 18 14:53:09 CST 2020 至 Sun Aug 16 14:53:09 CST 2020
证书指纹:
MD5: 6B:2D:30:CA:D0:C9:22:6C:2E:88:6A:4D:02:E2:58:FB
SHA1: 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
SHA256: B9:20:43:76:D3:2A:17:BC:82:79:C5:CF:9F:56:49:E5:68:3E:75:9A:CF:0A:D5:A8:8C:AC:FD:54:3C:E0:AD:A5
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
三. 加解密和签名验签的实现逻辑
- 概述流程图
1. CA机构和被发证书者的沟通
- CA公钥:验证证书时使用
- CA根证书(或中级证书)为
ca.cer
- 验证证书是否合法的步骤
- 证书是否是合法CA机构颁发。
- 证书有效期(一般是一年)。
- 证书是否在黑名单吊销列表里。
- 服务端B生成密钥对,并CA注册公钥,生成
server.cer
证书; - 服务端B发送
server.cer
证书到安卓端A,A会验证B证书的有效性,才会取出B的公钥,做后续其他处理。
2. 加密
- 加密:防止数据泄露。
- 加密解密流程:公钥加密,私钥解密
3. 签名验签
- 签名验签的作用:比如A给B发送数据(B<–A),则签名验签是用来让B验证给他发消息的是A。
- 签名的常见方案
- 对加密后的密文(用私钥)进行签名。
- 对密文选取部分内容进行签名。
- 对keys(即对key做非对称加密后的结果)和部分密文进行签名。
-
签名验签流程:私钥签名,公钥验签。
-
常见场景:网银验证用户身份(银行B<–用户A)
-
单向认证 & 双向认证
- 单向认证:服务端有证书,客户端没有证书。
- 保证我的客户端只能访问自己信任的服务器;
- 不能保证我们的服务器只能被我们自己的客户端访问。
- 双向认证:银行(银行需要验证用户身份,用户也需要验证银行身份)。
四. HTTPS的流程
HTTPS采用非对称加密+对称加密算法
- 客户端(如浏览器)请求一个url,比如https://baidu.com。
- server端收到请求后,把自己的公钥通过数字证书的方式传给客户端。
- 公钥不能直接传:直接传不安全。
- 客户端收到证书后,首先验证证书的合法性(使用CA公钥验证)。
- 如果证书合法,client会产生一个密钥key,利用刚刚拿到的server公钥对该密钥key进行加密,然后将加密后的密钥keys传给server。
- server端拿到该密钥keys之后,使用自己的私钥进行解密,即可得到client的密钥key。
- server端将client要的内容使用key进行加密,然后传给client。
- client拿到内容后使用key进行解密,同时展示内容。
小知识:公钥不能直接传的原因