我们一般用对称加密来加密数据,因为快,而用非对称加密来加密密钥或者用作数字签名
用对方的公钥加密对称密钥,用己方的私钥加密摘要,也就是原数据hash后得到的特征码
网络数据通信加密的功能包含四点:
数据完整性: 完整性可以通过对原数据进行hash求特征码来比对是否与原特征码一致来比对
数据私密性: 数据的私密性是通过对称密钥进行加密来进行传输
身份认证: 身份认证是通过用己方的私钥加密本数据的特征码(摘要)的方式来验证发送方是“我”,因为只有我有私钥
密钥交换: 密钥交换是能过互换双方的公钥来进行对密钥的加密,使得传到对方后,对方可用私钥解密
Alice加密
Alice首先对自己要发的数据进行hash单向加密生成特征码(摘要)
再用自己的私钥对摘要进行加密生成数字签名
随后用对称密钥加密原数据和数字签名
最后用Bob的公钥对对称密钥进行加密
把公钥加密过的对称密钥和对称密钥加密的数据传给Bob
Bob解密
Bob收到Alice发过来的数据(Bob公钥加密的对称密钥以及对称密钥加密的数据)
首先用Bob的私钥解开对称密钥
用对称密钥可以解开原始的数据以及Alice数字签名
用Alice的公钥可以解开数字签名得到特征码
单向加密hash得到的原始数据与解密的特征码进行比较,以查看数据的完整性
这个方法有一个缺陷,就是Alice的公钥传给Bob时安不安全,公钥在网络中传输时的可信度,Bob如何才能确定传过来的公钥是Alice的,之前解决数字签名的问题是用了Alice的私钥加密摘要的方法,但这个方法的前题是Bob已经有了Alice的公钥,现在总不能用Alice的私钥加密Alice公钥的方法来验证,所以这里引入第三方验证机构CA, 用CA根证书的私钥加密Alice的公钥及一些主机信息传给Bob, Bob需要知道Alice的公钥,只需要CA的公钥即可解出,如果Bob相信CA,那么由CA签名的证书也就被信任了。
CA工作流程
CA服务器拥有根证书,即自己签给自己的那个证书
openssl -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
Alice如果希望通过CA来颁发自己的公钥,
需要先本地生成自己的私钥key,
openssl genrsa -out alice.key
然后根据私钥产生证书请求文件csr
openssl req -new -key alice.key -out alice.csr
再提交到CA,由CA颁发,颁发下来的crt则是用根证书私钥签名过的公钥
openssl ca -in alice.csr -out alice.crt -days 365
Bob得到这个证书后,需要先到CA那下载根证书的公钥来解开才能得到Alice的公钥
CA制作流程
参考:
http://xxrenzhe.blog.51cto.com/4036116/1370114