添加盐到.htpasswd?

时间:2010-11-14 01:36:11

标签: encryption hash salt .htpasswd

是否可以在.hpasswd文件中为密码添加盐?我假设没有,因为服务器需要每个用户的盐以验证密码,我不能想到它将如何获得它们,但否则如果要获得列表它将是相当脆弱的。有解决方案吗?

非常感谢你的帮助, 本

2 个答案:

答案 0 :(得分:8)

默认情况下,htpasswd使用标准crypt功能,因此密码已经被加密 - 请注意,在此示例中,两个用户都使用相同的密码,但哈希值不同:

simon@diablo:~$ htpasswd -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ htpasswd -b htpasswd simon2 abcd
Adding password for user simon2
simon@diablo:~$ cat htpasswd 
simon:NWvm/LCCxQ64E
simon2:2I.LBzsRqULN6

(注意:通常不鼓励使用-b标志,因为其他用户可以看到您的命令行参数,因此可以看到密码)

哈希的前两个字符是salt;通过再次致电crypt()来验证密码。输入错误的密码会产生一个与散列密码不相等的字符串:

>>> from crypt import crypt
>>> crypt("wrongpass", "NWvm/LCCxQ64E")
'NWbxQgX1unvso'

而正确的密码产生预期的哈希:

>>> crypt("abcd", "NWvm/LCCxQ64E")
'NWvm/LCCxQ64E'

htpasswd -m使用不同的算法,该算法基于MD5并使用更长的盐:

simon@diablo:~$ htpasswd -m -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ cat htpasswd
simon:$apr1$mfvnBVmG$iIHIHOaH9vcImG5G.8eVa/

这里,salt是第二个和第三个$之间的8个字符。

htpasswd -s存储没有盐的SHA-1摘要;这似乎是为了与Netscape / LDIF兼容:

simon@diablo:~$ htpasswd -s -b -c htpasswd simon abcd
Adding password for user simon
simon@diablo:~$ htpasswd -s -b htpasswd simon2 abcd
Adding password for user simon2
simon@diablo:~$ cat htpasswd 
simon:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8=
simon2:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8=

这些可以很容易地反转 - 转换为十六进制摘要:

>>> "".join("%02x" % ord(c)
...      for c in "gf6L/odXbD7LIkJvjleEc4KRes8=".decode("base64"))
'81fe8bfe87576c3ecb22426f8e57847382917acf'

然后使用online hash database

答案 1 :(得分:2)

大多数情况下htpasswd实用程序already does use salts

crypt()和MD5格式通过预先添加一个随机盐字符串来置换表示,使字典攻击密码变得更加困难。

这就是(在某种程度上)密码文件中盐的目的。虽然服务器的.htpasswd文件中必须包含salt,以便服务器能够检查密码,但盐可以防御诸如rainbow tables之类的攻击技术的众多不同可能性。

但是,如果您的用户选择弱密码或常用密码,密码破解仍然是一个问题,因为攻击者(假定可以访问密码文件)将首先尝试这些,实际上非常快(不受速度限制)通过正常方式猜测,服务器和Internet连接)。我能给出的最好的建议是用户应该总是选择强密码。