Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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
Php 我的密码应该是多长时间?SHA-256足够好吗?_Php_Md5_Hash_Password Protection - Fatal编程技术网

Php 我的密码应该是多长时间?SHA-256足够好吗?

Php 我的密码应该是多长时间?SHA-256足够好吗?,php,md5,hash,password-protection,Php,Md5,Hash,Password Protection,我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在研究密码和登录。我以前只使用过MD5,但我读过关于密码安全的书,听说现在应该使用salt 我的计划是:每个用户都有自己的12个随机字符(#/·等)的salt,存储在users表中。salt在注册时与密码一起散列(使用SHA-256),并在登录时重新散列 你觉得这个怎么样?有什么可以改进的吗?我应该选择SHA-512和更长的盐,还是这就足够了?对于您的用例来说,这可能就足够了 但是,可以通过以下方式加以改进: 增加盐的大小 salt

我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在研究密码和登录。我以前只使用过MD5,但我读过关于密码安全的书,听说现在应该使用salt

我的计划是:每个用户都有自己的12个随机字符(#/·等)的salt,存储在users表中。salt在注册时与密码一起散列(使用SHA-256),并在登录时重新散列


你觉得这个怎么样?有什么可以改进的吗?我应该选择SHA-512和更长的盐,还是这就足够了?

对于您的用例来说,这可能就足够了

但是,可以通过以下方式加以改进:

  • 增加盐的大小

  • salt不应限于一小部分字符

  • 迭代散列,比如说1000次(键强化)


  • 看一看。

    您当前的方法已经足够。

    您建议的12个字节的长度对于salt来说应该足够了。这需要字典攻击来准备296个散列密码数据库。总有一天,这对一个破解者来说可能是一个微不足道的操作,但我们离那还有一段路要走

    NIST推荐SHA256具有足够的密码哈希强度,至少目前是这样

    如果您想探索更强大的密码安全性方法,请研究密钥增强技术,如,或使用自适应哈希。但是这些在SQL中没有直接的支持。您必须在应用程序代码中进行哈希运算,然后将哈希摘要发布到数据库中


    对于一个游戏网站来说,这似乎是一种过度的安全措施,但这是一种很好的做法。因为许多用户(不明智地)在游戏登录时使用与银行登录相同的密码!您不想对间接导致重大损失的身份验证违规负责。

    如果您真的担心,我会考虑使用whirlpool哈希函数,而不是SHA变体。Whirlpool已经被证明是一种非常强大的散列方法,并且没有碰撞历史或任何其他弱点(至少我知道)


    您可以通过使用PHP的功能来使用whirlpool。(但请注意,hash()需要PHP5.1.2或更高版本。)

    更新:

    不要使用哈希或HMAC。使用
    bcrypt
    scrypt
    。看

    原件:

    不要简单地散列。使用HMAC。(如果有可用的库,请避免自己进行哈希或加密,因为库可以从专家输入中受益。)

    参考文献:


  • 我注意到关于如何正确地进行密码散列的许多困惑,尤其是在stackoverflow上。我看到了一些非常糟糕的建议。所以我写了一个页面,应该把所有的事情都弄清楚。这比使用一个简单的散列要复杂得多

    更多信息和源代码:


    当有人对密码哈希有疑问时,请随时共享此链接。这是我在stackoverflow上的第一篇帖子,如果我做得不对,我很抱歉,我没有投你反对票,但我认为散列没有任何实际好处。我曾经读过这样一篇文章,如果密钥通过不安全的通道发送,它可以帮助防止密码被盗,但是当服务器与其数据库之间进行通信时,我怀疑它是否有帮助。我真的不知道,但我有一种直觉,连续的散列会给散列带来噪音,让其他人更容易复制和利用。盐可能是最好的方法。我指的是关键强化,例如PBKDF2(如上所述)。多次迭代被认为是最佳实践,因为它可以阻止对已知哈希值的暴力攻击,攻击者可以访问数据库并需要密码(许多人跨站点重复使用密码)。使用普通散列函数这样做并没有已知的数学缺陷。@Col.SHRAMPNEL salt阻止预先计算的字典攻击,并阻止彩虹表。多次迭代会阻碍暴力-salt以散列值著称,单是它还不够阻碍暴力。“我担心它会通过增加冲突来降低安全性”如果你能展示数学来支持这一点,你的直觉将在加密社区中立即赢得赞誉:-)看看你是否想阅读有关密钥拉伸的内容。非常好的建议。(虽然OP似乎使用了12个字符而不是12个字节来表示salt,这比熵小得多)。通过只使用可打印字符,他将使用少于8位的字符。这是一个糟糕的建议。SHA256不适合密码散列;太快了。您应该使用bcrypt、scrypt或PBKDF2。@D.W.您是对的,bcrypt或PBKDF2是更强的解决方案。这就是我在回答中提到它们的原因。所有接受可变长度字符串和输出固定长度哈希的哈希例程都有冲突。这在数学上是确定无疑的。SHA1和MD5(可能还有其他)的缺点是,可以通过两种方式更改单个字符串以产生冲突。这个弱点不适用于密码散列(尽管可以想象,用户可以捏造两个密码,从而产生相同的散列)。当然,所有散列算法都有冲突的机会。我的意思是,(据我所知)散列方法本身并没有缺点,它允许这些碰撞比数学上的碰撞概率更频繁地发生。我很感谢你的工作,试图详细地写下这一点。然而,该建议并未充分考虑到安全文献中的最新理解。关于盐渍的材料是好的,但是关于散列算法选择的材料不是那么好。您建议使用SHA256,但这不是哈希密码的好选择。法罗群岛