加密、解密、CA
SSL
SSL解释
SSL(Secure Sockets Layer 安全套接层),为Netscape所研发,是为网络通信提供安全及数据完整性的一种安全协议。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
SSL作用
在互联网通信中,不使用SSL加密的通信,都存在着潜在的危险。
威胁保密性的攻击:窃听、通信分析
威胁完整性的攻击:更改、伪装、重放、否认
威胁可用性的攻击:拒绝服务(DoS)
SSL实现安全保证的目标:
保密性:confidentiality,指通信双方的信息具有保密性,第三方无法查知
完整性:integrity,指通信双方的报文不能产生信息丢失。
可用性:availability,指通信方任何一方加密的信息可以被另一方解密。
加密和解密
加密方式
(1)对称加密:加密和解密使用同一个密钥。缺陷:使用者数量多时,密钥派发也会增加
(2)公钥加密:密钥分为公钥和私钥。公钥从私钥中提取,可公开给所有人。私钥则是通过工具创建。只供使用者自己使用。公钥加密的数据只能用已配对的私钥解密,反之亦然
(3)单项加密:提出数据指纹(特征码),只能加密,不能解密。主要用来验证数据的完整
数据加密
如下图:
上述加密方式只用了对称加密和公钥加密。这是一种简单的加密方法。对于私钥来说,它不能直接加密到数据上,因为公钥是公共的。任何人都可以得到。所以加密时使用接收方的公钥加密,解密使用接收方的私钥来解密。但是此种方法只能保证数据的安全性,并不能验证数据的完整性、一致性以及数据来源的可靠性
数字签名
数据的安全性得到保证之后,我们还需要验证数据的完整性、一致性以及来源的可靠性
对于数据的完整性和一致性,我们使用单向加密算法,来提取出数据文件的特征码,这个特征码称为“信息摘要(Message Digest)”。是独一无二的。
对于数据的来源,我们可以使用自己的私钥来加密特征码,对方拿公钥来解密,解密成功即可验证数据的来源。这个用私钥加密的特征码就叫做“数字签名(Signature)”
如图:
数据完整加密
结合前两种方式的加密方式,我们需将两者方式结合一下,用来来保证数据的完整性、安全性以及可靠性。经常使用的方法是:先进行数字签名,然后对签名加数据进行完整加密。如图:
但是这样,其实也不是安全的。如果张三和李四根本不认识,那么张三怎么知道李四给我的公钥一定是李四的呢。同样李四解密时怎么知道公钥就一定时张三的呢。这时就出现了一个组织专门为保证用户身份的一个组织—CA。
CA(转载)
CA(Certificate Authority)是数字证书认证中心,常称为证书颁发机构,申请者提交自己的公钥和一些个人信息(如申请者国家,姓名,单位等)给CA,CA对申请者的这些信息单向加密生成摘要信息,然后使用自己的私钥加密整个摘要信息,这样就得到了CA对申请者的数字签名,在数字签名上再加上CA自己的一些信息(如CA的机构名称,CA层次路径等)以及该证书的信息(如证书有效期限),就得到了所谓的数字证书。
如果某用户信任了该CA,就获取了该CA的公钥(实际上信任CA的其中一个作用就是获取CA公钥),使用该公钥解密数字证书就可以验证申请者的信息以及申请者公钥的可靠性(申请者的公钥只被CA的私钥加密,解密该私钥后只是需要验证可靠性)。
这里的关键是CA使用自己的私钥给申请者加密,那么如何保证CA是可信并且合法的呢?根CA是通过自签署数字证书的方式标榜自己的可信性和合法性,第一级子CA由根CA颁发合法数字证书,第二级直至所有的子CA都由上一级子CA颁发数字证书。对于多级子CA只需要信任根CA即可,因为获取了根CA的公钥,可以解密第一级子CA的证书并获取验证第一级子CA的公钥,层层递进,最终获取到为申请者颁发数字证书的机构并获取它的公钥。
另一种情况,虽然信任了根CA,但如果根CA授权的某个二级或者某个二级授权的三级CA不在信任列表中,就需要将这个中间的CA补齐,否则中间出现断层,无法成功解密该中间CA颁发的证书。通常这种中间CA的证书称为chain证书,例如"xxx.com.chain.crt"。如果购买的证书发给你的文件中包含了chain.crt文件,则说明他是中间CA,且有些浏览器或操作系统中没有内置它的CA,这时应该将chain证书也配置到web server上。
正是这些根CA和子CA组成了PKI。
信任CA后,每次接收到需要解密的数字证书时,还要去该颁发机构指定网站的证书吊销列表(CRL)中查询该证书是否被吊销,对于吊销后的证书应该不予以信任,这是信任CA的第二个作用。导致证书被吊销的可能性不少,例如申请者的私钥被黑客获取,申请者申请吊销等。
也有公司使用自签的证书,例如某些银行、12306有时候就要求下载证书并安装。使用自签证书的好处当然是省钱、方便啦。
SSL握手机制
SSL握手协议:
- (1)客户端向服务器端发送“hello”信息&#x