使用真实/假盐而不是锁定
我已经阅读了关于php登录脚本的各种主题,所以我不打算重新讨论这些讨论,但是我想知道在密码哈希中使用真实和假盐。
而不是ID /密码登录提示,我正在考虑ID#/ ID /密码登录提示。 我的用户都有身份证,与他们的职业中经常使用的公司无关。 如果他们输入真正的ID号和登录ID匹配,那么他们会得到真正的盐。 所有不匹配的条目都会导致密码产生假盐。 虽然这些ID号很可能在互联网上获得,但您必须知道用户的名称,这会使所有随机攻击都失败。 进行攻击的唯一方法是首先发现用户名,然后攻击我的系统。 用户身份不是公知的。
这是一种可行的方法吗? 如果我在一定次数的尝试后锁定了一个ID,并且在很多GLOBAL失败尝试之后延迟了登录尝试,那么会出现什么问题? 但是,我不打算对涉及假盐的任何企图进行锁定或限制。 当他们获得真正的食盐时,我只会实施这些失败者。 不过,如果他们获得现有的ID号码,我可能会考虑进行限制。
想法或建议? 这将是一个安全的替代方案,禁止IP,提出个人问题,验证码等?
我会写这个答案,因为看起来你对盐是什么以及它是如何工作感到困惑。
什么是盐?
salt应该是为每个用户生成的随机字符串。 在加密密码并将其存储在数据库中之前,您需要添加salt并将其存储起来,从而更改加密值的值。 盐可以确保某人如果能够访问您的数据库,并且实际上您的用户的加密密码不能使用彩虹表快速查找其未加密的密码。
彩虹表是一系列值及其加密的对应项,通过预先生成一个值列表,攻击者不需要强制加密密码,并且可以在O(1)
查找中“解密”密码。 因为你为每个用户随机产生一个盐,所以你的表格变得毫无价值。
它并不妨碍它们强制密码,并且不能代替强加密。
什么是假盐?
没有。 它不存在,它没有任何好的目的。
您的方法存在问题
首先,用户不应该看到或被发现它们的盐值,它存储在您的数据库中并被您的认证逻辑使用。 在测试密码的有效性时,没有理由不使用他们的实际盐分。 如果密码错误,它将无法认证。
其次,如果攻击者试图使用不存在的用户名登录那么太棒了,他们将永远无法访问帐户,并且如果他们将请求超载到服务器,则无需采取进一步的行动,在这种情况下,您需要找到一种方法来暂时阻止他们。
适当的答案将取决于您的公司能够忍受的安全级别或不安全性。 例如,系统是否会被审计? 用户如何在系统中创建? 用户是否会从非私人计算机访问此资源?
尽管我可以看到实现这样一个系统的理由,但我不会推荐它。 我认为其他人甚至会声称这是荒谬的。 其原因是,如果您有任何面向Web的应用程序,系统的安全性就会受到影响,这是非常可能的。
此外,完全阻止IP地址可能导致恶劣的用户体验。 我会建议实施反向图灵测试(如Capthcha或Mathcha)。
但最终,我赞成尝试摆脱密码认证的想法。 作为一个用户,我讨厌密码。 我的雇主的安全政策(以及我最担心的)密码本身就是可笑的。
编辑:我只是重新读你的评论说, this would make all random attacks fail
。 我想补充一点,这个假设似乎没有很好的基础给我。 猜测用户的名字比您想象的要容易得多。 特别是如果它是他们的真实姓名。