添加盐到.htpasswd?

Ben*_*Ben 3 encryption hash salt .htpasswd

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

非常感谢你的帮助,本

Sim*_*onJ 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通常不鼓励该标志,因为其他用户可以看到您的命令行参数,因此密码)

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

>>> from crypt import crypt
>>> crypt("wrongpass", "NWvm/LCCxQ64E")
'NWbxQgX1unvso'
Run Code Online (Sandbox Code Playgroud)

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

>>> crypt("abcd", "NWvm/LCCxQ64E")
'NWvm/LCCxQ64E'
Run Code Online (Sandbox Code Playgroud)

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/

这里,盐是第二个和第三个之间的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'
Run Code Online (Sandbox Code Playgroud)

然后使用在线哈希数据库.