第5章用户登录服务——5.3 密码保护

第5章用户登录服务——5.3 密码保护
John Yaml无论是客户端与服务端之间通过网络传输密码,还是将密码保存到数据库中,都需要保证密码安全。
5.3.1 使用HTTPS通信
首先我们来解决客户端发送注册、登录请求到服务端时,防止第三方抓包工具获取到密码的问题。客户端与服务端之间使用HTTPS通信。HTTPS是身披SSL外壳的HTTP,在HTTP通信链路中利用SSL/TLS建立全信道加密数据包,在请求传输过程中,第三方抓包工具看到的是密文,所以获取不到密码。
需要注意的是,使用HTTPS并不能彻底保证密码安全,因为HTTPS的加密、解密行为发生在HTTP层和TCP层之间,如图5-1所示。
这就意味着,虽然HTTPS在网络传输过程中可以保证数据是密文,但是数据包到达服务端后,一旦经过解密进入HTTP层,数据就会变为明文,这时如果攻击者入侵服务端并在网络层拦截数据,那么依然可以获取到密码。攻击者入侵客户端同样可以获取到密码,况且客户端被入侵的可能性远大于服务端被入侵的可能性。所以需要强调的是,HTTPS保证的是数据在传输过程中的安全性,而攻击者依然可以在客户端和服务端拦截数据得到明文密码。
5.3.2 非对称加密
为了防止用户密码在客户端和服务端泄露,很多互联网公司都选择在客户端提交密码前对密码进行非对称加密。我们可以将非对称加密直接理解为数据的加密和解密使用了两把不同的钥匙,分别是公钥和私钥。公钥由服务端下发给客户端,用于数据加密;私钥由服务端自己持有,任何经过公钥加密的数据都只能被对应的私钥解密。即使攻击者在客户端网络层截获了所下发的公钥也没用,因为数据解密所需的私钥藏在服务端。
在将密码组装到数据包前先使用公钥对其进行加密,即使攻击者截获了明文数据包,密码也依然是加密的,这样就可以保证密码在客户端和服务端的安全。使用非对称加密实现用户注册与登录请求安全传输的流程如下所述,如图5-2所示。
- 客户端从服务端获取公钥。
- 客户端利用公钥对用户提交的密码进行加密。
- 客户端使用HTTPS向服务端请求注册与登录。
- 服务端解密HTTPS,得到HTTP明文数据包。
- 用户登录服务处理数据包,使用私钥解密得到原始密码。
5.3.3 密码加密存储
接下来,我们解决密码在数据库中存储的安全问题。解决方法也是加密,只不过这里使用的是单向加密算法。单向加密算法指的是可以对数据加密,但是无法解密(即不可逆)的算法,比如MD5、SHA1等。用户注册、修改密码等场景都要存储密码,用户登录服务在存储密码前先对密码进行单向加密,然后存储加密结果;用户登录时,针对用户输入的密码,再次使用相同的单向加密算法加密,然后将加密结果与数据库中存储的值进行对比,如果它们相同,则说明密码一致。
总结
为什么HTTPS并不能彻底保证密码安全呢?
- 因为HTTPS的加密、解密行为发生在HTTP层和TCP层之间。
- 这就意味着,虽然HTTPS在网络传输过程中可以保证数据是密文,但是数据包到达服务端后,一旦经过解密进入HTTP层,数据就会变为明文,这时如果攻击者入侵服务端并在网络层拦截数据,那么依然可以获取到密码。
- 攻击者入侵客户端同样可以获取到密码,况且客户端被入侵的可能性远大于服务端被入侵的可能性。
- 所以需要强调的是,HTTPS保证的是数据在传输过程中的安全性,而攻击者依然可以在客户端和服务端拦截数据得到明文密码。
使用非对称加密实现用户注册与登录请求安全传输的流程?
- 客户端从服务端获取公钥。
- 客户端利用公钥对用户提交的密码进行加密。
- 客户端使用HTTPS向服务端请求注册与登录。
- 服务端解密HTTPS,得到HTTP明文数据包。
- 用户登录服务处理数据包,使用私钥解密得到原始密码。
什么是单向加密算法?
- 单向加密算法指的是可以对数据加密,但是无法解密(即不可逆)的算法,比如MD5、SHA1等。