用户名口令登录的安全增强方法
在这个时代,虽然很多人也意识到了信息安全的重要性,但是目前很多的场景里,还是用一些比较简单的方式来做身份的认证。比如网站登录,还是很多地方都是使用的用户名和口令机制。
身在信息安全产品设计这一个行当里,我当然早就清楚有哪些好的方法可以使身份认证(登录)更加安全,但是这些安全措施,很多都是要增大成本且不易实施的。在这种情况下,想方设法变得更安全,其实就是成本和安全之间的一个平衡,如何掌握好度,是最关键的。
就说一个网站的登录吧,直接在浏览器中,把用户填写的用户名、口令直接发给web服务器肯定是不好(因为走的是互联网,被偷听者截取去了就完了)。近年来的研究表明,成熟的协议如HTTPS,也是有漏洞可能被偷听的。
目前流行的是把口令送过去,数据库里保存着(比较简答的是明文口令,和用户登录送来的口令比对;稍微好一点的呢,数据库里是口令的MD5或SHA1,把送来的口令做MD5或SHA1,再对比。后一种主要是怕数据库被攻击,用户口令泄露)。
那么我设想的增强怎么做呢?我的设想是这样的:
上图中,SHA1是一种摘要算法,和MD5作用是一样的。不过MD5几年前被山东大学的王晓云教授破解,所以一般我都写SHA1,当然,实际使用中,MD5在这种场景下也是可以使用的。
现在已经有成熟的 javascript 库来做SHA1或MD5,到网上随便一搜就能搜到,所以不再赘述。
在上面这个流程图里。实际上送到服务器端的是K,K与服务器端随机数有关,因此,偷听者即便拿到K,也必须在当前的session里才能使用。
我们看到,虽然对高级的黑客或者木马(尤其是键盘木马)没有什么大的作用,但是对付偷听已经没有问题。而对付键盘木马,可以使用一些虚拟键盘等方式来解决,这也是成熟的一种技术,因此不再展开说了。
总的来说,上面的方案算是一种成本非常低廉的改进方案,至少,不是把口令(口令表示了用户的身份凭据)完全暴露在偷听者的面前啊,而是提高了偷听和攻击的难度。