面试总结4 - 数字签名,http和https
上一篇服务器响应用户请求中,对于RPC攻击和cookie攻击做了说明,而本篇博文则是着重对数字签名以及https加密协议做一说明。
1 加密算法
1 对称加密
对称加密:加密和解密的密钥一样,比如用123加密就是用123解密,但是实际中密码都是普通数据在互联网传输的,这样一点密码被中间人截取并破解,加密直接被攻破。
2 非对称加密
把密钥分为公钥和私钥,假设A要发送一封Email给B,他不想让任何其他人在传输中看到Email的内容,做法就是使用B的公钥对Email加密,只有B的私钥能够解密(B的私钥唯一性保证信件不会泄露)。
某天出意外了,有黑客冒充A给B发送Email,并且也用B的公钥加密,导致B无法区分这封邮件是否来自A。怎么办?此时A可以用自己的私钥加密,那么B收到邮件后如果用A的公钥可以解密邮件,那么证明这封信肯定来自于A。
3 总结 (没有用公钥去解密的,都是加密)
公钥的作用:对内容本身加密,保证不被其他人看到。
私钥的作用:证明内容的来源
公钥和私钥是配对关系,公钥加密就用私钥解密,反之亦然,用错的密钥来尝试解密会报错。
2 数字签名
1 概念
数字签名:
简单来说,三个元素: 公钥、私钥、hash函数。
- 公钥: 公开的
- 私钥: 只有发送方持有
- hash函数: 发送方和接收方都定义了hash函数。
那么发送过程如下:
发送方client, 接收方server:
- client对发送data执行hash函数,生成一段内容摘要str;
- client将str用密钥加密生成密文secret,然后将 data + secret 一起发送给server;
- server使用hash函数生成摘要str, 然后用公钥对secret解密,对比str和解密内容是否一致。
也就是 数字签名是加密, 数字签名验证是解密。
使用了非对称加密算法和数字摘要技术。
2 作用
- 保证信息传输的完整性
- 发送者的身份认证
- 防止交易中的抵赖发生,只有发送方有密钥
3 涉及算法
普通的数字签名算法包括三种算法:
- 密码生成算法;
- 标记算法;
- 验证算法。
此外还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。
3 数字证书
使用上述的数字签名仍存在一种情况:
如果黑客将server端的公钥给替换成自己的公钥,然后用自己的私钥发送数据,这是server是察觉不到的,所以需要数字证书。
1 数字证书
上述问题存在的原因就是client的公钥容易被替换。
那么client可以去找”证书中心”(certificate authority,简称CA),为公钥做认证。
证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。
server收到数据后使用CA的公钥解密数字证书,从而获取到A的公钥,然后执行的逻辑跟上述就一致了。
总结:
其实就是找了一个第三方数字签名,对client的公钥进行一次加密。
2 一些疑问
1 假设数字证书被伪造了呢? CA的责任
是的,传输中数字证书有可能被篡改。因此数字证书也是经过数字签名的,是不是感觉很绕貌似陷入了“鸡生蛋蛋生鸡”,我保证这是最后一个蛋- - !上文说道数字签名的作用就是验证数据来源以及数据完整性!B收到邮件后可以先验证这份数字证书的可靠性,通过后再验证数字签名。
2 要是有1万个人要给server发邮件,难道server要保存1万份不同的CA公钥吗?
不需要,CA认证中心给可以给server一份“根证书”,里面存储CA公钥来验证所有CA分中心颁发的数字证书。CA中心是分叉树结构,类似于公安部->省公安厅->市级派出所,不管client从哪个CA分支机构申请的证书,server只要预存根证书就可以验证下级证书可靠性。
3 如何验证根证书可靠性?
无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。
4 https简单介绍
数字签名和数字证书可以用于文件,当然也能用于html网页数据。
http的安全缺陷
- 无法验证服务端的身份
- 无法保证数据完整性
- 无法保证数据传输不被窃听
而https就是专门解决这三个问题,https使用数字签名+数字证书解决了前2个问题。
然后,再用SSL协议对传输通道加密,保证数据传输不被窃听。
SSL协议
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 TLS与SSL在传输层对网络连接进行加密。
服务器认证阶段:
1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;
2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;
3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;
4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。
用户认证阶段:
在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。
经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
两篇博客的传送门