目前我只是在玩 PHP,但我遇到了一个我想扩展的想法,并且需要知道它在您看来有多安全,以及我如何改进它以使其可以被实际使用。
这就是我在数据库中存储密码的方式:
纯文本密码-> 哈希密码(我使用漩涡,但任何方法实际上都可以)-> 随机/加扰哈希密码(使用 str_shuffle() 函数)。
我像这样将用户密码存储在数据库中,以确保如果数据库受到破坏,攻击者将无法反转数据库内损坏的密码哈希。(因为从某种意义上说,您如何反转曾经是散列的随机文本?-尽管我确信您可以通过比较共享相同字符的散列列表来创建可能性列表。)
我检查他们在登录表单上输入的用户密码是否正确(与数据库中损坏的哈希相比)的方法是计算两个字符串/密码中的单个字母+数字(af & 0-9),看看是否他们匹配,如果匹配,我假设他们正确登录。
再一次,我想知道您认为这有多安全,以及如何改进它以使其在实际使用中可以接受。(如果可能的话。)&我也想尽我所能避免“可逆”哈希。(即创建我自己的方法来确保密码匹配的想法,我想让它更像是一个最佳猜测假设,以完全帮助确保攻击者不可能反转数据库中的密码。
是的,我知道这很愚蠢,因为它很可能会导致更多的安全漏洞,而不是帮助修复它们。但这只是我在玩弄的东西,也许希望使它实用。
其他信息:
1) 密码用唯一的盐存储(所以不是 1 个帐户共享相同的盐)
2)密码盐总是在变化(每次用户帐户成功登录时,它都会更改数据库中的用户盐。我这样做是为了更改数据库中的哈希值,从而减少密码冲突的频率(希望) 以及防止不需要的用户多次使用相同的错误密码登录(如果他们设法遇到一个,实现此目的的唯一方法是通过暴力破解或“猜测”,任何登录系统都容易受到攻击)。
当我说密码冲突时,我的意思是“你好”和“蓝色”这个词有最小的机会共享相同的确切字符数(正如我解释的那样,我计算了单个字符 + 数字,并比较它们,假设它是正确的密码.)
3) 我也可能会保留散列密码的前 3 个字符/数字不受 str_shuffle 的影响,以帮助确保密码正确。(通过创建 2 个检查,1)检查两个字符串是否共享相同的 FIRST 3 CHARS/Numbers & 2)然后比较每个字符串中的字符数。(希望再次减少密码冲突)。
4) 显然将添加其他安全措施(即最大登录尝试次数、验证码等。以帮助防止自动暴力破解,使黑客更难找到可能的密码或真实密码。
我已经成功地完成了这个 PoC,它就像一个魅力,虽然我还没有针对字典攻击/蛮力攻击测试 PoC,以查看密码冲突的可能性。& 他们的频率。
如果我说了很多“无用”的信息,请忽略它。我只是尽力合理地解释这一点。