说明
分享者:架构师 黄燧
主要内容有:算法介绍,签名验签,程序设计,OpenSSL证书生成、代码实现
算法介绍
这里主要用到两类算法,一个是加解密的,一个是消息摘要算法
加密算法
加密算法可分为对接加密和非对称加密算法。
对称加密,加解密都使用同一个密钥,运算速度快,比如AES。
非对称加密,加密和解密使用的不同的密钥(公钥和私钥),运算速度比较慢,比如RSA。
消息摘要算法
单向不可逆,生成特定长度的固定消息,比如MD5、SHA256。
签名和验签主要就基于这两种算法。
后面简单介绍下签名和验签,图片是网络上的。
这个过程是将一个文本进消息摘要计算,生成的文本就比较短,也是固定额.
这个是使用私钥对摘要消息进行加密.
因为私钥的特性,这个文本可以作为签名.
这个将消息和签名组合成已签名的消息.
这是正向过程.
这时用公钥对签名进行验签, 可以获取到签名私钥加密的消息摘要.
可以获取到前面私钥加密的消息摘要.
这个是将原消息进行摘要运算,比较两个摘要消息是否一样.
这个整个签名和验签过程就结束了.
下面说下程序设计,把签名验签和加解密结合起来.
程序包最终要实现基于证书的加密签名和验签解密两个功能。
会涉及到算法的选择,加密解密过程,证书的使用.
算法选择
消息加密选择:AES对称加密算法,对称加密算法比非对称加密算法快很多,适用于消息的加密。
签名算法选择:RSA非对称加密算法,SHA256消息摘要算法,非对称加密算法比较慢,组合使用可适应各种场景。
场景分析
前提:公钥证书需要提前发放给对方.
发送方
- 对消息使用AES算法加密
- 将加密消息作为基础文本,先进行SHA256摘要算法运算,再使用RSA私钥进行加密,得到签名。
- 将加密消息和签名组合成新的消息发送给对方
接收方
- 收到消息,使用RSA公钥对签名进行解密,成功即说明发送方即私钥持有方
- 解密后获得签名中的SHA256摘要值。
- 对消息中的加密消息进行SHA256摘要算法运算,获得加密消息的SHA256摘要值
- 将两个摘要值进行比较,如果相同,说明加密消息没有被修改
- 对加密的消息进行AES解密,获得原始消息
上面的过程中还存在一个问题,就是AES算法的密钥没有说明如何传送给对方。而且上面过程中只提到了单方面的RSA私钥和公钥,即发送方的RSA私钥和公钥。
AES的密钥(Key和盐)肯定不能用自己来加密,而且用发送方私钥加密也存在不安全因素,因为公钥很可能被非法使用。这样只剩用接收方提供的公钥来加密了,而且这是最安全的,接收方收到加密的AES密钥后使用其私钥进行解密即可。
基于以上思路,就可以做工具包的设计了。
正向过程
反向过程
证书
证书这里主要是用来提供私钥和公钥的,需要提前生成,放置在指定路径。
我们这里指定使用CER证书和PFX证书。
PFX证书是私钥证书,给自己应用使用,需要设置密码,不能直接打开。
CER证书是公钥证书,发放给客户方应用使用,可直接打开,里面是个明文的密钥。
证书的生成使用Openssl命令即可完成。
主要要做的就是定义和指定证书的基本信息,使用指定算法(比如RSA)生成私钥文件,使用私钥文件生成公钥和私钥证书等。
这里简单黏贴下生成证书的文件的命令,有兴趣的可以等下看我的文档地址。
2、生成证书
2.1 创建私钥privkey.pem
openssl genrsa -out privkey.pem 2048
# 或者
openssl genpkey -algorithm RSA -out privkey.pem
扩展参数:-des3
2.2 使用cnf配置创建证书申请文件req.pem
openssl req -new -key privkey.pem -out req.pem -config ca.cnf
2.3 创建cer证书
openssl req -x509 -key privkey.pem -out test.cer -config ca.cnf
扩展参数:-days 750
2.4创建pfx证书
openssl pkcs12 -export -in test.cer -inkey privkey.pem -out test.pfx
Export Password:123456
也可以直接到openssl官网去查看
代码实现
正向时序图
反向时序图
里面算法实现基本用的jdk包里的。
具体实现也有参考网络资源,但思想了解了,就知道如何做和做什么了。