【问题标题】:Should I filter user password before storing them in database?我应该在将用户密码存储到数据库之前过滤用户密码吗?
【发布时间】:2017-07-05 07:45:35
【问题描述】:

建议永远不要信任用户并在将所有输入存储到数据库之前对其进行过滤,以避免sql注入等。

用户密码呢?我应该在存储它们之前进行任何类型的消毒吗?如果我这样做了,用户输入他们的密码登录可能与经过清理的版本不匹配。

(密码在存储前已加密)。

最佳做法是什么?

【问题讨论】:

  • 不要将普通密码存储在数据库中。而是使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用PBKDF2(又名Rfc2898DeriveBytes)、password_hash/password_verifyBcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。保护您的用户很重要,请使用安全的密码方法。

标签: database security passwords


【解决方案1】:

建议不要信任用户,并在将所有输入存储到数据库之前对其进行过滤,以避免 sql 注入等。

不,一点也不。建议使用prepared statements避免SQL注入,并通过在显示数据时正确转义特殊字符来避免HTML/script注入。

我是否应该在存储它们之前进行任何类型的消毒

不,你不应该。而且您也不应该加密密码。您应该使用像 Bcrypt 这样的强大加密算法来对它们进行加盐和哈希处理。

【讨论】:

  • Bcrypt 是一种安全的方法,不仅仅是一种加盐哈希,它是一种迭代方法,需要约 100 毫秒的计算时间
【解决方案2】:

我是否应该在存储它们之前进行任何类型的消毒...

除了 JB Nizet 关于存储的回答之外,您应该在接受之前过滤它们。考虑一下,Password1 符合 NIST 安全要求,但它也在 [几乎?] 每个攻击者的前 N ​​个密码列表中。显然,您不希望攻击者能够使用他们最喜欢的密​​码列表来对付您。

列表本身可能相当大。我见过 10,000、100,000 和 1000 万的大小。可以使用 Bloom 过滤器将列表压缩到 20KB 或 40KB。然后,当用户选择密码时,对照过滤器检查候选密码。布隆过滤器会产生一些误报,但这没关系。只需要求用户选择不同的密码。

这是一个包含 10,000 个密码列表的 GitHub:noloader/Password-Lists。另一个列表可在danielmiessler/SecLists 获得。另请参阅 Peter Gutmann 的 Engineering Security, Chapter 6: Passwords

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2021-03-18
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2017-01-22
    相关资源
    最近更新 更多