首先介绍下加解密和签名的使用场景,后面再介绍下https相关的加解密原理。
签名
使用场景最多的就是保证数据不被外界篡改,保证数据的完整性。常用的签名方式也可以成为hash算法:MD5,SHA1,SHA256等。
在一个场景就是保证数据的唯一性。由于网络的不稳定性,同一个请求可能会发生多次,如果对请求做唯一性的话,通过签名就可以鉴别。比如说转账业务中,对同一个转账行为,不能发生多次。
在服务端对服务端的场景中,签名方式比较常见。在客户端与服务端交互过程中,客户端只可以做验证,在客户端生成的签名都认为是不安全的,即使使用RSA这样的签名方式。
加解密
在数据传输过程中,如果是私密数据,则需要数据的加密。数据加密方式分为对称加密和非对称加密。对称加密使用同一个私钥进行加解密,非对称方式使用一个密钥加密,另一个密钥解密。目前使用最多的是RSA算法。但是非对称加密特别耗cpu性能,而对称加密要小得多。https结合了两者保证了数据的加密传输。
在非对称方式中,一个成为公钥,另一个成为私钥。私钥要保存再服务端,保证不能泄露,而公钥可以是公开的。
如果在服务端加密,由于公钥是公开的,即使是加密数据,也能被破解。如果客户端向服务端传送数据,客户端可以使用公钥加密,由于私钥只有服务端才有,那么加密数据只能由服务端解开,即使这样,也不能这些数据可信的,第三方完全可以利用公钥加密数据传到服务端。
在用户登录场景中,完全可以用公钥加密传输。
两者结合
在很多场景下,上面的两种方式需要结合起来一起使用。传输数据=加密(数据+签名)。
https原理
随着https的普及,更多的网站使用https传输数据。https可以理解为http+TSL。TSL协议在http协议之下,传输层协议之上。http数据经过TSL加密之后传给传输层,同样当接受到数据后,TSL解密后返回至http层。
https交互过程中用到了非对称,对称以及HASH算法。使用对称算法主要为了性能。
- 客户端访问服务器时,服务端会把生成的证书信息返回。这里的证书信息包含数字签名,服务端的公钥等。
- 客户端会验证证书信息,证书一般不是免费的,需要向证书机构申请。浏览器内一般会集成了系统提供的证书,如果证书没有通过认证或者伪造的,浏览器会提示
- 客户端用证书公钥解密得到服务端的公钥,客户端也会随机生成一个密钥,让后通过服务端公钥加密,传输到服务端。
- 服务端私钥解密,获取客户端生成的密钥,后面数据传输时,用这个密钥进行加密,用的是对称加密方式。
https比http慢的原因是多了两次RTT。
中间人攻击是https最常见的威胁。我们用fiddler查看https数据时,用的就是这种手法。中间人会劫持访问,用伪造的证书回复给客户端。如果客户端继续访问,中间人可以获取报文,甚至篡改数据。
当浏览器提示警告时,对不信任的网站不要轻易访问。也不要随意添加证书认证到系统中。最常见的12306网站证书,浏览器会提示不安全的,也就是说12306的网站证书不被操作系统所承认。不受承认的证书,最好不要轻易安装。