基于密码的用户身份认证

@ 2013-05-30 09:36:06
标签:

    密码认证的基本原理和实践

    密码认证的基本原理是假设只有用户本人知道自己的密码。

    对用户来说,密码设置的越复杂显然被人猜中的可能性就越小。

    对密码的保存者来说,主要的挑战是如何保证用户密码的安全性。

    得到他人密码的方法之一是“猜”。比如生日,比如名字等。多数人在设置密码时都有自己的规则,这个规则很可能是跟个人信息、爱好、习惯等有关。对此的解决办法,是记住一些随机生成的密码。

    获得他人密码的再一种方法就是直接暴力尝试的办法(Brute Force)。防止这种攻击的主要思路是限制用户尝试的次数,比如图形验证码的使用就是为了防范这种攻击——基于程序识别“变形”的图形不是一件容易的事情这样一个假设。

    得到他人密码的另外一种途径是从服务提供方获得,比如获得了保存密码的数据库。为了解决这个问题,密码数据库一般不应该保存明文,而应保存hash过的密码。可怕的是,作为用户很难知道网站是否保存了自己的明文密码。CSDN是一个IT类网站,其泄露出的密码居然就是明文的,非常另人失望。

    hash算法有两个基本特点:可重复和不可逆。即不同的原文理论上有可能得到相同的hash值;也正是因为如此,从hash值反推出原文是不可能的。

    对于hash过的密码,主要的挑战在于是否可以轻易找到一个能产生相同hash值的原文。如果可以,则这个原文就有可能可以作为密码来使用。由于hash算法的不可逆特点,反推原文无非两种办法,或者从一个已有的表中直接查找,或者从一个字典中逐条计算hash值以进行匹配。

    对于直接反查“原文”的方法,网上有一些,比如MD5数据库。这种类型的数据库有时被称作彩虹表(rainbow table)。

    对付彩虹表的一个办法是加salt。即密码原文被hash之前先加进一些额外的字符。这样一来,用彩虹表反查出的结果在用系统进行验证时由于又加入了一遍salt而不能通过验证。(另见:密码+Salt的一些考虑

    对于字典扫描的方法,很容易想到的是,hash值的长度越长,寻找原文的难度越大;不太容易想到的是,hash值计算方法的效率越低,寻找原文的难越大。

    Hash算法 Digest Size
    MD5 128 bits
    SHA-1 160 bits

    从效率方面入手的一个方案是Blowfish算法。Blowfish算法严格意义上来说是加密算法,而不是hash算法,其改进版本用于加强密码保护。

    网络资源

    • phpass —— 基于PHP的password hashing类
    标签:

      分享到:
      comments powered by Disqus

      21/23ms