Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 存储和使用散列的一部分_Security_Hash_Password Protection - Fatal编程技术网

Security 存储和使用散列的一部分

Security 存储和使用散列的一部分,security,hash,password-protection,Security,Hash,Password Protection,我正在构建一个安全的loginmodule,我已经阅读了所有这些关于在散列之前添加密码的指南。。然而,我觉得所有的密码仍然是“可删除的”,可以访问散列和salt 所以我开始考虑,如果我只在数据库中存储一段散列,会怎么样。在PHP中,当使用SHA-256进行哈希运算时,我会得到一个64个字符的字符串,如果我将其中的50个保存在数据库中,并在登录时进行相同的50个字符比较,会怎么样 暴力会造成额外的误报。但是他们仍然需要尝试很多很多密码,而真正的密码肯定不会被撕碎 我的想法有什么遗漏吗?或者这真的有

我正在构建一个安全的loginmodule,我已经阅读了所有这些关于在散列之前添加密码的指南。。然而,我觉得所有的密码仍然是“可删除的”,可以访问散列和salt

所以我开始考虑,如果我只在数据库中存储一段散列,会怎么样。在PHP中,当使用SHA-256进行哈希运算时,我会得到一个64个字符的字符串,如果我将其中的50个保存在数据库中,并在登录时进行相同的50个字符比较,会怎么样

暴力会造成额外的误报。但是他们仍然需要尝试很多很多密码,而真正的密码肯定不会被撕碎

我的想法有什么遗漏吗?或者这真的有效吗


/安德烈亚斯

没有名副其实的哈希是可逆的。从SHA-256散列的输出中去掉14个字符,将其减少为SHA-228;这可能不是你想的。如果您使用的salt足够大(64位或更多),并且它是适当的随机数,那么您就足够安全了,如果您存储64个字符而不仅仅是50个字符,那么就更安全了

我觉得所有的密码仍然是“可删除的”,可以访问哈希和salt

散列不能反转:这正是散列的目的和性质

攻击的原因是,知道由于某些其他信息泄漏导致的散列,您通过计算输入变量所有可能值的散列来强行解决问题,如果您得到了成功,您猜测的值很可能就是最初用于创建散列的值

Salt减慢了这种攻击的速度,因为它必须对每个密码单独执行,而不是一次对所有密码进行预先计算,但现代硬件现在可以快速计算哈希值,因此不再具有以前的威慑价值

通过减少存储的散列数据量,您当然可以降低暴力猜测正确的可能性:例如,如果您只保留了8位散列数据,那么攻击者就无法真正猜测原始密码,因为每256个密码中就有一个匹配。但其必要的缺点是,您自己对该散列进行身份验证的使用被大大削弱,使得每256次随机猜测中就有1次进入

使存储的哈希值不易唯一猜测的好处与使主身份验证接口更容易受到偶然性影响的成本成正比。离线可猜测散列的情况只发生在数据库出现漏洞时,而不是像可猜测身份验证接口那样的持续威胁,因此我们通常不太关心它

在您的示例中,200位散列(50个十六进制数字)仍然可能为所有常用密码字符串提供唯一的值,因此没有什么真正的好处

最终,防止对泄漏数据库进行离线猜测的问题是无法解决的,但目前我们最好的方法是让攻击者和真正的身份验证服务器的哈希计算都变慢。有关常见的实现,请参见bcrypt和PBKDF2。即便如此,这也只能在足够长的时间内减缓大规模猜测离线攻击,让您有时间在发现数据泄露后要求用户更改密码