这里是一篇精炼而全面的介绍文章,把围绕证书的那些概念都串起来了。本文将对一些细节做一些补充。
对称加密和非对称加密
首先,我们需要一个清晰的定义来理解加密、密钥、算法这些概念:
可以把加密算法看作一个复杂的函数变换,Y = f(M, Key),Y代表密文,即加密后得到的字符序列,M代表明文,即待加密的字符序列,Key代表密钥,f代表加密算法。
言简意赅。所以,对称加密(算法)就是指加密密钥和解密密钥相同;非对称加密是指加密密钥和解密密钥是一对不同的值(公钥(public key)和私钥(private key))。私钥只能由持有者安全保管,不能外泄,而公钥则可以发给任何请求它的人。
另外,观察这个式子,f(加密算法)往往是公开的,因而要想使密文不被别人破解,必须确保密钥不被泄露。
对称加密算法常见的有DES和AES,速度很快;非对称加密常见的就是RSA,速度较慢。非对称加密的特性是,用私钥加密的数据只有用公钥才能解开,用公钥加密的数据只有用私钥才能解开。
散列算法(Hash)
散列算法和加密没有关系。它就是数据结构中的哈希算法(只不过运算更加复杂一些)。散列算法把很长的数据变成固定长度的文本,因而也称为数据的摘要(digest)或指纹(fingerprint)。因为是摘要(信息从多到少),因而是不可逆的,即不能从摘要倒推出数据。同样,哈希算法也会出现碰撞,即不同的文本产生了相同的摘要,只不过这种碰撞很难找到。
常见的散列算法有MD5和SHA1,后来被攻破(能迅速找到碰撞文本)。现在新的标准是SHA2和SHA3。
散列算法的主要用途就是校验数据是否被更改。比如发送一封邮件,同时附上正文内容的摘要,接受者可以计算正文的摘要,再与这个摘要比对,从而判断邮件内容是否被篡改。但是仅有这个还是不够,因为网络黑客既然能够篡改正文,就能够篡改摘要。因而,再结合非对称加密技术,把摘要用发送者的私钥加密了,接受者用发送者的公钥解密摘要,就能确保摘要是真实的(因为只有发送者有私钥,能够让接收者解密出正确的摘要),从而可以验证正文。这个加了密的摘要就称为数字签名(Digital signature)。
其实我们可以发现,不用散列算法也是可以实现安全通信的。发送方可以直接用接收方的公钥加密内容,只有接受方能够解密内容。但是非对称加密很慢,实际应用还是使用对称加密来加密较大内容。(可以参考这篇文章)
关于安全通信的深入思考,可以看看这篇博客
SSL/TLS协议
阮一峰的博客描述的非常好。
基本过程:
客户端向服务器端索要并验证公钥。
双方协商生成"对话密钥"。
双方采用"对话密钥"进行加密通信。
数字证书
数字证书是一个经证书授权中心(CA)数字签名的包含公钥拥有者信息以及公钥的文件。数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公钥。
最简单的证书包含一个公钥、名称以及证书授权中心的数字签名。
接收者(如浏览器等客户端)如何验证证书是否是合法的呢?
证书发行者要用自己的私钥把证书内容的摘要加密,作为数字签名放在证书中。客户端读取证书的数字签名部分,用自身根证书列表中对应的公钥证书对其进行解密。如果解密成功,并且证书哈希值与签名内的哈希值匹配一致,可证明站点提供的证书确实是该CA根证书签发的。
操作系统以及浏览器都带有自己的根证书集合,常见的有verisign等。
而所谓“自签名证书”就是自己生成一个证书,然后用自己的私钥加密摘要产生数字签名。除非把这个证书加入系统信任证书集合中,否则客户端是不会信任这个证书的。
证书里面有什么?
常用的证书标准有X.509和PKCS #12。通常证书里应该含有签发机构名、证书用户名、数字签名、用途、有效期、算法、公钥等信息。
常见的证书文件后缀:
.cer, .crt, .der – 常见的DER格式证书。
.pem - Base64编码的证书。包含在"-----BEGIN CERTIFICATE-----" 和"-----END CERTIFICATE-----"之间。
.pfx, .p12 - 可以包含多个证书,以及用密码保护的私钥。
SSL证书绑定
就是把证书和私钥绑定到web站点上,用于SSL。