纵观互联网,绝大多数网站都采用用户名和密码的方式认证用户的身份。安全问题百出。
首先,密码存储问题,服务器端肯定不能存储用户密码的明文(前段日子的密码门事件让我们认识到了事情的严重性)。那么服务器端存储什么呢?密码的Hash值?还是(密码+随机数)的hash值(随机salt二次加密)?
下面细细道来。
服务器端存储密码hash值的话不大靠谱,如果黑客获取了服务器数据库的话,随便找一个明文,做一下hash,和数据库里面的hash值对比一下,就可以找到一大批具有此hash值的用户名。也就意味着,黑客轻易获得了一大批用户名和密码(虽然密码都是同一个)。
salt二次加密技术还是比较靠谱的一个,起码从服务器端入手的黑客需要耗费相当大的力气去找碰撞。但是salt方案就安全吗?我的答案是否定的,正所谓无孔不入,此路不同另寻他路。
既然要使用salt二次加密方法,那么用户在登录的时候肯定是在网络上传输了自己密码,明文传输可靠吗?稍微会用sniffer就能抓到一大堆用户名密码。
传输过程中绝对不能明文传输密码。那怎么传输密码呢?也传输hash值吗?
传输hash值?有意义吗?照样可以用sniffer把hash以后的值截下来,然后自己手工构造数据报文,把hash值贴上去。同样也能通过服务器端的认证。
额。。。传输hash值不行,那怎么办呢?传输一个密码的变形?使用挑战/应答模式?
A----"我要登陆"----->B
A<----"随机数R"----