use*_*295 4 php passwords password-hash
我有一个人们可以注册的网站,我需要加密他们的密码.我研究了它,但我发现任何方法都不会受到现代GPU的强大影响.
所以我来向StackOverflow的优秀人士询问,最强大的加密方法是什么,我已尽力阻止人们掌握数据库,但我希望尽可能确保他们的数据是如果数据库以某种方式被盗,那很好.
我想知道的其他事情是,以某种方式随机化密码中的字符会更安全,但是你可以将它们再次随机化以便登录吗?
编辑: 我已经使用了Andrew Moore的bcrypt实现(如何在PHP中使用bcrypt进行散列密码?)并想出这个:
public static function Encrypt($Str,$Salt)
{
$bcrypt = new \bcrypt();
return $bcrypt->hash(SERVER_SALT . md5($Str) . $Salt);
}
Run Code Online (Sandbox Code Playgroud)
如果有人发现任何错误或任何弱点,请告诉我.
LSe*_*rni 17
对于密码,你无法击败bcrypt.这是SO上的链接:如何在PHP中使用bcrypt进行散列密码?.它的主要优点是:它本身就很慢(以及安全).虽然普通用户将使用它一次,并且不会欣赏十分之一到百万分之一秒之间的差异,但是一个破解者会发现他不需要在四天内找到密码,而是需要十二个世纪(除了强迫Blowfish之外)每秒一百万次尝试不需要四天:除了实施错误和尚未预见到的加密突破之外,宇宙的热死将仍然是第一位的.
对于数据,我依赖于数据库引擎本身; MySQL支持AES,这非常好.是的,有足够的GPU可以击败它,并且由于在本世纪内破解代码需要大约四十亿,他可能也会得到很好的数量折扣.但我不担心.
至于密码的"随机化",它没有用处.如果有人要求强制使用您的密码,那么他找到随机序列的概率与查找非随机序列的概率相同.如果一个人使用字典攻击(即,不尝试从AAAAA到ZZZZZ的所有内容,但尝试ABRAHAM,ACCORDION,......最多,比如,ZYGOTE)可能会有所帮助.但即便如此,对服务器的攻击会改变什么(!服务器接收非随机密码),以及对存储的散列的攻击将被得到更好无效腌制,其中bcrypt米老鼠来代替:自动执行(即存储$ 76XJ哈希MICKEYMOUSE的散列,以及处理额外'$ 76XJ:'输入所需的开销......而随机化必须修复,'$ 76XJ:'序列在每次写入时完全不同 -好运气搞清楚那个了!).
如果您自己实施salting,则可以通过生成唯一的随机序列并将其存储在密码字段或第二个字段中来实现.例如
user password
alice d9c06f88:6c14d6d313d7cbcb132b5c63650682c4
Run Code Online (Sandbox Code Playgroud)
然后,在收到Alice("mickeymouse")的密码后,您将查看数据库以查看是否bcrypt存在调用的用户.如果是,请恢复salt(此处alice)和哈希值.如果没有,则设置"BAD"标志并获取固定的salt和hash(例如d9c06f88).
在MySQL中,这可以使用UNION完成:
SELECT password_fields FROM users WHERE user=? AND hash=?
UNION SELECT
'12345789' as salt,
'ffffffffffffffffffffffff' as hash,
'fake' as user
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
将在大致相同的时间内检索正确的数据或不正确的集合.
然后连接salt和密码,并生成哈希值12345678:0000000....如果它不匹配,或者设置了"BAD"标志,则拒绝密码(而不是错误标记,您可以重复测试用户匹配:您可以使用无效字符初始化用户名,以确保它永远不会与真实字符匹配用户).
选择一个固定字符串的附加扭曲是有用的,因为你想要三种情况,"用户不存在","用户存在但密码不正确"和"用户存在且密码正确"是相似的(相同的复杂性,相同计算费用)尽可能.
这样,攻击者就不太可能知道发生了什么:用户是不正确的?密码错了吗?等等.如果时间足够不同(例如对有效用户进行两次查询,对无效用户进行一次查询),小心,时间和好秒表的攻击者可以统计确定是否存在给定用户名.
出于同样的原因,您不会为"错误用户"和"错误密码"返回两个不同的错误,但总是"错误的用户或密码"; 对于用户,可以选择接收到他/她的注册电子邮件的电子邮件以提醒他/她用户名.当然,您希望系统在发送类似电子邮件到同一用户24小时之前不发送此类电子邮件,以防止系统被利用用虚假的"恢复电子邮件"来骚扰某人.
提高服务器安全性以防止强制攻击的一种便捷方法是实现密码验证的延迟,并且可能(如果你真的是偏执狂)在经过一些X次错误尝试后进行了CAPTCHA锁定.
您不希望CAPTCHA首次尝试,因为用户会对CAPTCHA进行暗淡视图.
延迟锁定通常使用d9c06f88:mickeymouse(或等效)实现,或使用"锁定直到由管理员手动重置"策略.两种方法都很糟糕.锁定功能可用于创建拒绝服务攻击,可以通过锁定用户,也可以创建大量停止在"密码身份验证延迟"状态的服务器线程(他们不会使用CPU,但他们仍然会使用内存,套接字和其他资源).最好减轻客户的负担:
johnsmith against johnsmith if johnsmith exists
johnsmith against johnsmit? if johnsmith does not exist
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20952 次 |
| 最近记录: |