大概是一年前,我发现某学校的统一身份认证的用户名和密码竟然是HTTP+明文传输的,连HTTPS都没有;而近日恰好看见了b站的一个视频12306的数据泄漏意味着什么?密码是如何在服务器上存储的?哈希算法有什么用?缓存是如何实现的?,这个视频主要说明了哈希算法是什么,利用哈希算法如何将密码存储在服务器上,以及哈希算法的其它作用。视频通篇似乎默认了12306网站不存储用户的明文密码,而没有探究12306究竟使用了何种方法存储用户的密码。虽然我不清楚12306数据泄露的详情,但显然默认12306不会明文存储密码而得出12306数据泄露不会造成用户账户被盗是不负责任的。于是我决定看一下12306究竟是怎么传输密码的,下面将展示某校统一身份认证网站、12306网站CSDN网站这几个网站的密码传输方式,以供参考。

各网站的密码传输方式

测试使用的用户名和密码分别均为testAccounttestPassword。测试方法是使用Google Chrome浏览器打开待测试网站的登录页面,同时打开DevTools,然后输入用户名和密码进行登录,最后在DevTools中查看传输的认证数据。

某校统一身份认证

某校统一身份认证

可以看到该网站直接将用户名和密码在应用层明文传输(对应表单字段usernamepassword),不做任何形式的加密,也不做哈希运算。并且该网站使用明文的HTTP协议,只要捕获到登录该网站的流量,就能直接取得用户的用户名和密码。

12306

12306

可以看到该网站同样直接将用户名和密码在应用层明文传输(对应表单字段usernamepassword),不做任何形式的加密,也不做哈希运算。然而该网站使用HTTPS协议,流量是被加密过的,因此除非密钥泄露或发生中间人攻击,就算捕获到登录该网站的流量也不能进行解密而取得用户的用户名和密码。

CSDN

CSDN

该网站与12306相似,同样直接将用户名和密码在应用层明文传输(对应表单字段userIdentificationpwdOrVerifyCode),不做任何形式的加密,也不做哈希运算。然而该网站使用HTTPS协议,从加密过的流量中获取明文用户名和密码几乎不可能。

上述网站存在的问题

上述网站在应用层均以明文的方式传输密码,这样即存在三个问题:

  1. 密码在应用层以明文的方式被传输到这些网站的后端服务器,即:这些网站的后端具有查看用户明文密码的方法;
  2. 既然这些网站在应用层传输密码的方式是明文,那么就存在开发这些网站的程序员“偷懒”直接存储明文密码的可能,从而增大了数据泄露后可能的损失;
  3. 使用的下层协议(运输层及以下协议)若为明文协议,或易被破解的协议,则存在用户登录这些网站的流量被捕获后明文密码泄露的风险。

对于第三个问题,即使使用HTTPS,使得基于流量捕获(sniff)的攻击几乎不可能成功,这些网站也有可能使用明文存储密码,从而在发生数据泄露时将用户的明文密码一并泄露,给用户造成重大损失。而要求用户信任这些直接将明文密码传输到后端的网站不会存储明文密码,也不会“偷窥”用户的密码是不负责任的。

结论

不应存储用户的明文密码,这是公认的原则,然而目前没有人能保证不会有程序员由于“偷懒”,或由于认为“没有人会攻击这个小破网站”而直接存储明文密码。而使用加密(加密算法不包括哈希算法,哈希算法不是加密算法)协议传输明文密码也不能消除这种风险。较好的方法应该是利用加盐的哈希算法,根本不传输任何形式的明文密码,从而向用户表明,该网站已经断绝了在后端存储明文密码的可能,并且就算攻击者捕获并解密了流量也不能反推出明文密码。

以上观测结果、推断和观点若存在谬误和不合理之处,欢迎提出。



# 学校   # 12306   # 缺陷   # 风险   # 漏洞   # vulnerability   # potential risks