写点什么

如何设计实现一个证书加密签名工具包

用户头像
三尾鱼
关注
发布于: 2020 年 08 月 08 日

1、简介

本文主要介绍如何设计开发一个使用证书对数据进行加密签名的工具包。

包含内容:算法介绍,签名验签,程序设计,OpenSSL 证书生成、代码实现。

适用场景:经非安全网络进行数据通信时,使用加密签名方式以保证数据传输安全。

2、算法介绍

  • 加密算法

加密算法可分为对接加密和非对称加密算法。

对称加密,加解密都使用同一个密钥,运算速度快,比如 AES。

非对称加密,加密和解密使用的不同的密钥(公钥和私钥),运算速度比较慢,比如 RSA。


  • 消息摘要算法

单向不可逆,生成特定长度的固定消息,比如 MD5、SHA256。

3、签名验签

  • 签名

1、将消息进行摘要算法运算,生成特定的较短的消息。

2、使用私钥对摘要消息进行加密

3、将消息和签名组合成已签名的消息



  • 验签

1、公钥解密,获得摘要消息

2、将原消息进行摘要运算,比较两个摘要消息是否一样


更详细可参考:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

4、程序设计

程序包最终要实现基于证书的加密签名和验签解密两个功能。会涉及到算法的选择,加密解密过程,证书的使用。


  • 算法选择

消息加密选择:AES 对称加密算法,对称加密算法比非对称加密算法快很多,适用于消息的加密。

签名算法选择:RSA 非对称加密算法,SHA256 消息摘要算法,非对称加密算法比较慢,组合使用可适应各种场景。


  • 过程分析

前提:公钥证书需要提前发放给对方


发送方

1、对消息使用 AES 算法加密

2、将加密消息作为基础文本,先进行 SHA256 摘要算法运算,再使用 RSA 私钥进行加密,得到签名。

3、将加密消息和签名组合成新的消息发送给对方

接收方

1、收到消息,使用 RSA 公钥对签名进行解密,成功即说明发送方即私钥持有方

2、解密后获得签名中的 SHA256 摘要值。

3、对消息中的加密消息进行 SHA256 摘要算法运算,获得加密消息的 SHA256 摘要值

4、将两个摘要值进行比较,如果相同,说明加密消息没有被修改

5、对加密的消息进行 AES 解密,获得原始消息


上面的过程中还存在一个问题,就是 AES 算法的密钥没有说明如何传送给对方。而且上面过程中只提到了单方面的 RSA 私钥和公钥,即发送方的 RSA 私钥和公钥。

AES 的密钥(Key 和盐)肯定不能用自己来加密,而且用发送方私钥加密也存在不安全因素,因为公钥很可能被非法使用。这样只剩用接收方提供的公钥来加密了,而且这是最安全的,接收方收到加密的 AES 密钥后使用其私钥进行解密即可。


基于以上思路,就可以做工具包设计了。主要分为两部分:加密签名和验签解密。

1、加密签名设计,将消息生成带有签名的密文。


2、验签解密设计,将带有签名的密文进行验签,并解密获得原始消息


  • 证书

证书在这里主要是用来提供私钥和公钥的,需要提前生成,放置在指定路径。


  • 补充说明

本节主要是了解思路,知道为什么这样做,这样做的理由是什么。到具体场景可以根据需要进行调整。

5、证书生成

我们这里指定使用 CER 证书和 PFX 证书。

PFX 证书是私钥证书,给自己应用使用,需要设置密码,不能直接打开。

CER 证书是公钥证书,发放给客户方应用使用,可直接打开,里面是个明文的密钥。


下面是使用 Openssl 生成证书的一个笔记,有一些注释。主要内容的就是定义和指定证书的基本信息,使用指定算法(比如 RSA)生成私钥文件,使用私钥文件生成公钥和私钥证书等。

1、创建一个缺省配置文件<file:ca.cnf>【可选】
[ req ]default_bits = 2048default_keyfile = privkey.pemdistinguished_name = req_distinguished_name
[ req_distinguished_name ]countryName = Country Name (2 letter code)countryName_default = CNstateOrProvinceName = State or Province Name (full name)stateOrProvinceName_default = JiangSulocalityName = Locality Name (eg, city)localityName_default = NanJingorganizationName = Organization Name (eg, company)organizationName_default = SheldcommonName = Common Name (e.g. server FQDN or YOUR name)commonName_max = 64commonName_default = Ted CA TestemailAddress = test@email.address

2、生成证书
2.1 创建私钥privkey.pem
openssl genrsa -out privkey.pem 2048或者openssl genpkey -algorithm RSA -out privkey.pem
扩展参数:-des3
2.2 使用cnf配置创建证书申请文件req.pemopenssl 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.pfxExport Password:123456

3、查看私钥openssl pkey -in privkey.pem -text -noout
证书申请openssl req -in req.pem -text -verify -noout
cer证书openssl x509 -in test.cer -noout -text
# 查看证书完整信息openssl x509 -in test.cer -text -noout
# 查看证书包含的公钥openssl x509 -in test.cer -pubkey
# 查看哪个 CA 机构签发了证书openssl x509 -in test.cer -issuer
# 查看证书的有效期openssl x509 -in test.cer -enddate

pfxopenssl pkcs12 -in test.pfx -info -noout

4、其他生成公钥openssl rsa -in privkey.pem -pubout -out pubkey.pem

复制代码


6、代码分享

  • 加密和签名的时序图

  • 验签和解密的时序图


程序执行示例

  • 请求方进行加密签名,接收方进行验签和解密


代码分享

github:https://github.com/huangsui/hs-crypto


发布于: 2020 年 08 月 08 日阅读数: 97
用户头像

三尾鱼

关注

还未添加个人签名 2018.07.10 加入

还未添加个人简介

评论

发布
暂无评论
如何设计实现一个证书加密签名工具包