最近在看OpenSSL相关的资料,看了很久还是感觉有点不得其法,尤其对其与python内的应用还是没多大头绪,
先把知道的整理一下出来,目前会用到的加密方法是基于PKCS7做数字签名,不知道这样的描述算不算准确
SSL(Secure Socket Layer) 是一种加密技术,可以提供对称加密和非对称加密。由于它在协议层里正好是在传输层与应用层之间,这就决定了上层应用必须经过它,这就是它广泛流行和易于实现的原因。
对称加密有md5,sha1。由于md5已被学者证明可以计算出加密冲突,即它有一定的不安全性,所以建议用sha1加密。
非对称性加密有RSA,即密码有一对,一个私钥,一个公钥,公钥可以让所有人知道,私钥只有自己知道。这样理解,服务器产生一对密钥,公钥给别人即客户端,客户端用它来加密,加密后发给服务端,服务端用自己的私钥解密后得到数据。
数字签名就和上面的过程相反,即数据由服务端用私钥加密,客户端用服务端的公钥解密,解得出来就说明这数据包的确是出服务端发过来的。数字签名是由服务端自己签的,但没人去验证这个服务端是不是你所要访问的真实的,所以需要第三方来帮忙检验,就和支付宝处于第三方来协调的位置一样。这个第三方就叫CA。所以服务器产生的公钥就交给CA,CA用CA自己的私钥加密,即数字签名,加密生会生成证书,证书还是要交给服务端,放在服务端那边。当客户端访问服务端时,服务端就会把这个证书安装到客户端上。(数字签名需要确认两点:一、信息是由签名者发送的;二、信息自签发后到收到为止未做过任何修改)
数字签名原理:1. 被发送文件采用hash算法对原始报文进行运算,得到一个固定长度的字符串,称为报文摘要;2.发送方生成报文的报文摘要,用自己的私钥对报文进行加密来形成发送方的数字签名;3.数字签名将作为报文的附件和报文一起发送到接收方;4.接收方首先从接收到的原始报文中用同样的算法计算出新的报文摘要,再用发送方的公钥对报文附件的数字签名进行解密,比较两个报文摘要,若相同则可以确认。
PKCS #7:是由RSA安全体系指定的一组公钥密码学标准,又名加密消息语法标准(Cryptographic Message Syntax Standard)An RSA Laboratories Technical NoteVersion 1.5Revised November 1, 1993*1. 范围这一标准描述了待加密数据的一般语法,比如数字签名和数字信封。该语法允许递归,如一个信封能够包含在另一个当中,或者一方能够对一已存在的封装数据进行签名。它也允许专有的属性和消息的内容一起被鉴别,比如签名时间,并且提供其他属性如伴随着签名的连属(countersignature)。该语法的一个简化版提供了发布证书和CRL的方法。这一标准和PEM(Privacy-Enhance Mail)兼容,体现在签名数据和签名并封装的数据内容上,以一种PEM兼容格式构成,并能够在无需任何加密操作的情况下转换成PEM消息。类似地,PEM消息也能转换成签名数据和签名封装数据的内容格式。这一标准能够支持多种基于认证的密钥管理体系结构,比如它的一个提议已收录在PEM[RFC1422]中。
一些体系结构上的决定比如何种证书颁发者才是“顶级”的,何种实体证书颁发者应被授权,何种可辨别名能够被接受以及颁发者应该遵循怎样的证书策略等等这些问题不在本标准讨论范围之内。由这一标准产生的值可能是BER编码的,这意味着该值会以8位字节串(octet string)的形式表示。众所周知,虽然许多系统能够可靠地传输专有的8位。
OpenSSL实现的pkcs#7标准中包括6种数据内容:数据(data),摘要数据(digest),数字信封数据(enveloped),签名数字信封数据(signed_and_enveloped),摘要数据(digest),加密数据(encrypted).
数据(data)是指铭文打包,即为简单的ASN1_STRING数据类型;
签名数据(sign)把数据以及签名值打包,其中包括签名者的证书,CRl等,目的为确定发送者的身份;
数字信封数据(enveloped)使用接收者的公钥(从证书获取)加密数据,目的是为保护数据,拥有私钥的接收者才能解开数据;
签名数字信封数据(signed_and_enveloped)
加密数据(encrypted)使用对称算法加密数据
摘要数据(digest)对数据摘要后打包
任何类型的内容能够同时被任意数量的签名者签名,签名数据的产生过程有如下几步:
1. 对于每一个签名者,他用消息摘要算法计算出摘要值 。
2. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密。
3. 对于每一个签名者,把加密的消息摘要和其他的签名者特定信息放入signer_info值中。每个 签名者的证书、crl等也在这一步被收集进来。
4. 把所有签名者的信息摘要算法、他们的signer_info值和内容一起放进sign值中。