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

非常感谢您的帮助,本

有帮助吗?

解决方案

默认情况下,htpasswd使用标准 地下室 函数和密码已经腌制 - 在此示例中请注意,两个用户都具有相同的密码,但哈希是不同的:

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'

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

>>> 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/

在这里,盐是第二和第三个角色 $.

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'

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

其他提示

htpasswd 效用 已经使用盐了 在大多数情况下:

crypt()和MD5格式通过准备随机盐字符串来列出表示形式,以使对密码的字典攻击更加困难。

这就是密码文件中盐的目的。虽然必须将盐包括在服务器的 .htpasswd 申请服务器能够检查密码,这是盐可能会防御此类攻击技术的众多不同可能性 彩虹桌.

但是,如果您的用户选择弱密码或常见的密码,则无论如何,密码破解是一个问题,因为攻击者(假定可以访问密码文件)将首先尝试这些问题,实际上很快(不受服务器速度的限制,互联网连接),通过以普通方式猜测。我能提供的最好的建议是,用户应该始终选择强密码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top