所以我正在制作一个游戏网站。没有什么会流行的:P
现在我正在考虑密码安全性,我将使用加盐,但我没有在帐户表中添加一个新列,而是考虑使用帐户名称作为盐,因为它不能更改,并且是“唯一的”。我的意思是 2 个用户不能有相同的帐户名。
但我在想,如果让我们说某人的账户名香蕉是多么安全。我的意思是这个词在黑客使用的这些词表中必须很流行。
假设帐户名是香蕉,密码是 hello(用 sha1 散列),这很容易反转,对吗?
所以我正在制作一个游戏网站。没有什么会流行的:P
现在我正在考虑密码安全性,我将使用加盐,但我没有在帐户表中添加一个新列,而是考虑使用帐户名称作为盐,因为它不能更改,并且是“唯一的”。我的意思是 2 个用户不能有相同的帐户名。
但我在想,如果让我们说某人的账户名香蕉是多么安全。我的意思是这个词在黑客使用的这些词表中必须很流行。
假设帐户名是香蕉,密码是 hello(用 sha1 散列),这很容易反转,对吗?
不,您应该遵循标准做法并为每个用户生成一个新的唯一盐,并将其与数据库中的其他字段一起存储,这并不难。
黑客可以在彩虹表中查找 sha 摘要并发现它与输入“bananahello”匹配(考虑到“bananahello”已经在车辆彩虹表中)。他可以看到用户名是'banana',所以密码是'hello'。
我会散列类似于HTTP Digest HA1散列的东西:sha1(username.realm.password)。现在,为您的领域('example.com')定制的彩虹表很难再见。附带的好处是您实际上可以在您的站点上实现 Digest 身份验证,这比 Basic 和表单要好得多。
没有风险。无论如何,用户名都是公共知识。并且散列从来都不容易逆转——这就是散列的全部意义所在。
至于字典攻击,您可以通过密码复杂性策略来防范它。
编辑:是的,为了防止彩虹攻击,只需在盐前面加上一个较长的任意字符串。SHA1("whooooohooomysiteisthebest_bananahello") 不太可能出现在彩虹表中。
最好不要使用盐,但不会像随机盐那样安全。
至少在计算上以某种方式置换只有您知道的用户名以获得盐。虽然哈希值不容易逆转,但您希望保护自己免受暴力攻击。如果您使用未置换的用户名作为盐,您可以更容易地通过字典攻击来破解。
加盐只是防止预先计算的攻击。有可能已经计算了带有字典盐的彩虹表,它仍然不能阻止传统的暴力破解,这将很快偶然发现 Remus 的“bananahello”示例。
通过逐字使用公共用户名,您已经删除了盐的值,唯一的任务是计算该已知盐的彩虹表。因此,要回答您的问题,是的,您的实施很容易(但可能不会很快)逆转。