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