对于多用户网站,我应该严格验证我的用户'密码?
我已经搜索了一下,我只发现了有关如何来验证用户密码的问题。但我知道如何为密码存储在数据库中创建盐渍哈希(PHP' s password_hash()
),我知道如何来验证这些密码(PHP
s password_verify()
)。
我问我应该在我的网站上对用户密码设置哪些类型的限制。由于密码永远不会显示在网页上,我应该像用户名一样严格限制吗?
我知道用户名是显示的,并且容易受XSS attacks攻击(我已经阻止用户名),但密码不同,并且无法以这种方式被黑客入侵(我认为这是它的工作原理;如果我错了,请纠正我。
我知道密码通常是个人的,非常独特。我不知道是否应该限制可以使密码更安全的特殊字符,包括与XSS攻击类似的特殊字符。
我询问是否应该允许任何密码(在某些字符限制内);如果没有,那么什么是推荐(安全)方法?
答案 0 :(得分:1)
首先,密码强度
这对于防止密码猜测或暴力攻击非常重要。密码越强 - 当然越好。例如,您可以将其限制为最少10个字符,并且需要数字和大写字符。这已经相当强大,但您还可以要求使用!
,$
,@
,#
等符号。密码非常安全
至于安全存储密码 - 这是一个不同的主题 - 您应该永远以开放形式存储或显示密码。总是用它们哈希,例如:
$password = password_hash($password, PASSWORD_DEFAULT);
将结果字符串存储在数据库中 今天这被认为是最安全的。
要检查输入的密码是否正确,您只需使用函数password_verify()
将输入的密码与存储的哈希密码进行比较。
$success = password_verify($entered_password, $hash_stored_in_mysql);
$success
将成为true
或false
,如果密码匹配与否,您需要知道的全部内容。
今天有这个password_hash
和password_verify
这么好,在添加这些有用功能之前,人们使用了许多愚蠢和错误的方法来对密码进行哈希或加密!
答案 1 :(得分:1)
您应该允许ASCII字符集中的任何字符(尽管you could allow unicode如果您想要稍微复杂一些,例如使用密码强度计时)。如果使用bcrypt,则应将最大长度设置为72个ASCII字符,因为PHP实现仅限制对这些字符进行散列:
对algo参数使用PASSWORD_BCRYPT会导致密码参数被截断为最大长度为72个字符
这很好,因为有些实现会对长度施加更大的限制(55个字符)。
With Unicode this is more complicated too,因为某些字符最多可能占用4个字节。我的建议:坚持使用ASCII,密码可以足够安全(> = 64位熵),因为它使事情变得更简单,如果你的用户使用密码管理器(他们应该),大多数密码管理器只支持ASCII字符集。 / p>
如果将数据输出到页面,则XSS只是一个问题。理想情况下,您的系统应实施一项策略,即只输入密码,不输出密码(即使在<input type="password" />
字段中)。这样可以长期增强密码的安全性。