用户原始密码破解的方法和对策

用户原始密码破解的方法

这里说的用户原始密码破解有两个前提:

1. 黑客拿到了用户加密后的密文。举个例子,系统的/etc/passwd文件被盗走了。如果不知道密文,直接用不同的原始密码去尝试登陆系统来破解,可以很容易在登录尝试的地方做限制,比如错误3次30分钟内禁止再尝试等。
2. 黑客知道系统由原始密码产生密文的算法。这个算法有很多种,比如:

using a hash (MD5, SHA, SHA256)
using unique salt per entry and a hash (MD5, SHA, SHA256)
using bit/key stretching mechanisms or being overall time expensive (PBKDF2, bcrypt, scrypt, phpass)

一般破解的方法有这么几个:
1. 穷举法
2. 字典法
3. 彩虹表法

穷举法是用从一个猜测的原始密码出发,通过已知的算法来计算密文,然后将计算得到的结果和密文做比较,如果一致就认为找到了原始的密码。由于加密算法的值域空间有限,可能存在两个不同的原始密码对应同样的密文,找到原始密码中的任何一个,都可以认为破解成功了。
理论上讲,穷举法是肯定可以破解出原始密码的,唯一的问题就是消耗时间的长短。如果花了100年才找到原始密码,我们就可以认为这个破解方法失效了。

字典法是在穷举法的基础上做了一些优化。人们选择密码不是完全随机的,往往是一些单词和数字的组合,这些常见的组合形成一个字典。我们可以基于这个字典里的密码,来穷举破解。这样一般可以大大加快破解速度。但是也存在根本找不到原始密码的可能。

对于这两种方法,抵御的手段就是减缓由原始密码计算得到密文的速度,比如由原始密码得到密文需要1秒钟。这对于正常的系统运行来讲,不是一个不能接受的时间,但是如果穷举法每尝试一个密码都要消耗1秒钟,那基本上穷举法就废掉了。
这里通常的做法就是迭代,迭代1000或者更多的次数。随着计算机计算能力的提高,这个迭代次数也需要相应的增加。

彩虹表法的思路和穷举法不一样,先构造一个比较大的原始密码–>密文的表,然后直接从这个表里查密文,直接找到对应的原始密码(这个描述是不准确的,实际上彩虹表是根据hash冲突的方法,极大的压缩了这个反向的表,里面存储的实际上是很多链条)。彩虹表的规模越大,找到原始密码的可能性就越大。彩虹表可以自己生成,或者从网上下载构建好的彩虹表。但是要注意选择对应加密算法生成的彩虹表。

因为彩虹表在破解的时候,不需要大规模的计算密文,所以通过减缓计算加密密码的速度的方法不能很好的防御这种破解。比如经典的MD5加密法,有很多网站可以直接从md5值查询原始密码:
http://www.xmd5.org/index_cn.htm、http://md5.rednoize.com/。

怎么抵御这种破解呢?方法是给每个原始密码增加一个salt. 计算加密密码的时候,不直接从原始密码出发,而是从(原始密码+salt)出发来计算密文。这样提前准备的彩虹表就不能很好的工作了。
如果一个系统里有多个密文,每个密文都应该使用不同的salt。

PBKDF2标准就是从上面2个角度,来加密用户的原始密码的:

The PBKDF2 key derivation function has five input parameters:

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

where:

  • PRF is a pseudorandom function of two parameters with output length hLen (e.g. a keyed HMAC)
  • Password is the master password from which a derived key is generated
  • Salt is a cryptographic salt
  • c is the number of iterations desired
  • dkLen is the desired length of the derived key
  • DK is the generated derived key

 

Print Friendly

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>