SHA1 vs md5 vs SHA256:用于PHP登录?

问题描述 投票:132回答:10

我正在进行php登录,我正在尝试决定是否使用SHA1或Md5,或者我在另一篇stackoverflow文章中读到的SHA256。他们中的任何一个比其他人更安全吗?对于SHA1 / 256,我还使用盐吗?

另外,这是一种将密码存储为mysql中的哈希的安全方法吗?

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);
php login md5 sha1 sha256
10个回答
106
投票

都不是。你应该使用bcrypt。你提到的哈希都经过优化,可以快速简便地在硬件上使用,因此破解它们具有相同的特性。如果您没有其他选择,至少一定要使用长盐并重新哈希多次。

Using bcrypt in PHP 5.5+

PHP 5.5提供new functions for password hashing。这是现代Web应用程序中密码存储的推荐方法。

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

如果您使用的是旧版本的PHP you really should upgrade,但在此之前,您可以使用password_compat来公开此API。

另外,请让password_hash()为您生成盐。它使用[CSPRNG](http://

Two caveats of bcrypt

  1. Bcrypt会默默地截断超过72个字符的任何密码。
  2. Bcrypt将在任何NUL字符后截断。

Proof of Concept这里有两个警告。)

您可能很想解决pre-hashing your passwords before running them through bcrypt的第一个警告,但这样做会导致您的应用程序首先进入第二个。

不要编写自己的方案,而是使用安全专家编写和/或评估的现有库。

TL; DR - Use bcrypt


0
投票

让我们假设下一点:黑客窃取我们的数据库,包括用户和密码(加密)。黑客用他们知道的密码创建了一个假帐户。

MD5很弱,因为它短而流行且几乎每个没有密码的哈希生成都是字典攻击的弱点。但..

所以,假设我们仍在使用带有SALT的MD5。黑客不知道SALT,但他们知道特定用户的密码。所以他们可以测试:????? 12345其中12345是知道密码而且?????是盐。黑客迟早会猜到SALT。

但是,如果我们使用MD5 + SALT并且我们应用了MD5,那么就无法恢复信息。但是,我再说一遍,MD5仍然很短。

例如,假设我的密码是:12345。SALT是BILL CLINTON

输入:827 CSB 0 Yadah 06 Q 4 S 4 A 16891 4 4他喜欢

md5与哈希:56adb0f19ac0fb50194c312d49b15378

mD5与md5的哈希:28a03c0bc950decdd9ee362907d1798a我试图使用那些在线服务,我发现没有能够破解它。而它唯一的MD5! (可能就像今天一样,因为我在网上生成了md5)

如果你想要矫枉过正,那么如果使用盐和两次,SHA256就足够了。

tldr MD5(HASH + MD5(密码))= ok但短,SHA256绰绰有余。


0
投票

md5加密是最差的之一,因为你必须转换代码并且它已经被解密了。我会推荐你​​SHA256。我编程时间更长,并且有很好的经验。下面也是加密。

password_hash() example using Argon2i

<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
The above example will output something similar to:

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

22
投票

我认为使用md5或sha256或任何针对速度优化的哈希是完全正常的,我很好奇听到其他用户可能有的任何反驳。这是我的理由

  1. 如果你允许用户使用诸​​如上帝,爱情,战争,和平等弱密码,那么无论加密,你仍然会允许用户键入密码而不是哈希,这些密码通常是先使用,所以这不是与加密有关。
  2. 如果您没有使用SSL或没有证书,那么收听流量的攻击者将能够提取密码,并且任何使用javascript等加密的尝试都是客户端的,并且很容易破解和克服。同样,这与服务器端的数据加密无关。
  3. 暴力攻击将利用弱密码,并再次因为如果您没有登录限制3或甚至更多一点,您允许用户输入数据,那么问题将再次与数据加密无关。
  4. 如果您的数据库受到损害,那么很可能一切都已被破坏,包括您的散列技术,无论您制作它有多么神秘。同样,这可能是一个心怀不满的员工XSS攻击或SQL注入或其他与您的密码加密无关的攻击。

我相信你应该仍然加密,但我唯一可以看到加密的方法是阻止已经拥有或以某种方式获得数据库访问权限的人只需大声读出密码。如果是未经授权访问数据库的人那么你就有更大的问题需要担心这就是索尼因为他们认为加密密码保护包括信用卡号码在内的所有信息而保留的原因所有它所做的就是保护那个字段。

我可以看到复杂的数据库密码加密的唯一好处是延迟员工或其他有权访问数据库的人只读取密码。所以如果它是一个小项目或者其他什么我不会担心服务器端的安全性,而是我会担心更多关于保护客户端可能发送到服务器的任何内容,例如sql注入,XSS攻击或过多的其他方式你可能会受到损害。如果有人不同意,我期待着从客户端那里读取超级加密密码的方式。

我之所以想要明确这一点,是因为人们常常认为加密密码意味着他们不必担心它会受到损害而且他们不再担心网站安全问题。


15
投票

正如Johannes Gorset指出的那样,the post by Thomas Ptacek from Matasano Security解释了为什么简单的通用散列函数(如MD5,SHA1,SHA256和SHA512)是密码散列选项不佳的原因。

为什么?它们太快了 - 你可以使用现代计算机计算每个核心每秒至少1,000,000个MD5哈希值,因此对人们使用的大多数密码都是可行的。这比基于GPU的破解服务器集群要少得多!

没有键拉伸的盐析只意味着您无法预先计算彩虹表,您需要特定地为该特定盐构建它。但它不会真的让事情变得更难。

用户@Will说:

每个人都在谈论这个,就像他们可以通过互联网被黑客攻击。如前所述,限制尝试使得无法通过Internet破解密码并且与散列无关。

他们不需要。显然,在the case of LinkedIn中,他们使用常见的SQL injection vulnerability获取登录数据库表并在线下破解了数百万个密码。

然后他又回到了离线攻击场景:

当整个数据库遭到破坏时,安全性真正发挥作用,然后黑客可以针对md5哈希每秒执行1亿次密码尝试。 SHA512慢大约10,000倍。

不,SHA512不比MD5慢10000倍 - 它只需要大约两倍的时间。另一方面,Crypt / SHA512是一个非常不同的野兽,就像它的BCrypt对应物一样,执行key stretching,产生一个非常不同的哈希,内置一个随机盐,计算时需要500到999999倍之间的任何东西(伸展是可调的)。

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

所以PHP的选择是Crypt / Blowfish(BCrypt),Crypt / SHA256或Crypt / SHA512。或者至少是Crypt / MD5(PHK)。见www.php.net/manual/en/function.crypt.php


13
投票

使用SHA256。它并不完美,因为SHA512对于快速哈希来说是理想的,但是在选项之外,它是明确的选择。根据任何散列技术,请确保使用哈希值来增加安全性。

作为补充说明,FRKT,请告诉我哪里有人可以轻松破解盐渍SHA256哈希?我真的很有兴趣看到这个。

Important Edit:

继续前进请使用bcrypt作为强化哈希。更多信息可以是found here


盐渍编辑:

使用随机数或随机字节流等。您也可以将数据库中记录的唯一字段用作盐,这样每个用户的盐就不同了。


4
投票

人们似乎缺少的是,如果黑客可以访问数据库,他可能还可以访问哈希密码的php文件,并且可能只是修改它以向他发送所有成功的用户名密码组合。如果他无法访问web目录,他总是可以选择一个密码哈希,并将其写入数据库。换句话说,哈希算法与系统安全性并不重要,并且如果您不使用SSL,则限制登录尝试,然后攻击者可以只是监听连接以获取信息。除非您需要花费很长时间来计算算法(为了您自己的目的),否则使用具有用户特定盐的SHA-256或SHA-512就足够了。

作为一个额外的安全措施,设置一个脚本(bash,batch,python等)或程序,并给它一个晦涩的名称,并检查并查看login.php是否已更改(检查日期/时间戳)并发送电子邮件如果有的话。还应该记录所有登录时使用管理员权限的尝试,并记录所有登录数据库的失败尝试并将日志通过电子邮件发送给您。


3
投票

每个人都在谈论这个,就像他们可以通过互联网被黑客攻击。如前所述,限制尝试使得无法通过Internet破解密码并且与散列无关。

盐是必须的,但复杂性或多种盐甚至不重要。任何盐都可以阻止攻击者使用预制的彩虹桌。每个用户使用一个独特的盐可以阻止攻击者创建一个新的彩虹表,以用于整个用户群。

当整个数据库遭到破坏时,安全性真正发挥作用,然后黑客可以针对md5哈希每秒执行1亿次密码尝试。 SHA512慢大约10,000倍。使用当前功能的复杂密码仍然需要100年才能使用md5进行暴力破解,使用SHA512需要10,000倍的时间。盐根本不会停止暴力,因为它们总是必须知道,如果攻击者下载了你的数据库,他可能仍然在你的系统中。


1
投票

由于碰撞问题,MD5很糟糕 - 两个不同的密码可能产生相同的md-5。

Sha-1对此非常安全。您存储salated sha-1版本密码的原因是,服务器不会将用户的密码保留在文件中,以至于他们可能正在与其他人的服务器一起使用。否则,它有什么区别?

如果黑客窃取了你的整个未加密的数据库,那么,密封密码的唯一方法就是阻止他冒充用户以便将来登录 - 黑客已经掌握了数据。

如果您的用户输入的是普通密码,那么攻击者拥有散列值有什么用呢?

即使具有未来技术的黑客每秒可以产生一百万个sha-1密钥用于暴力攻击,你的服务器会每秒处理一百万登录以供黑客测试他的密钥吗?如果您让黑客尝试使用salted sha-1登录而不是像普通登录那样的密码。

最好的办法是将错误的登录尝试限制在某个合理的数字 - 例如25,然后将用户计时一两分钟。如果累积的bady登录尝试在24小时内达到250,请关闭帐户访问权限并通过电子邮件发送给所有者。


1
投票

这是MD5和SHA1之间的比较。你可以清楚地了解哪一个更好。

enter image description here


1
投票

使用argon2i。 argon2密码哈希函数赢得了密码哈希竞赛。

其他合理的选择,如果不能使用argon2,则是scrypt,bcrypt和PBKDF2。维基百科有这些功能的页面:

MD5,SHA1和SHA256是消息摘要,而不是密码散列函数。它们不适用于此目的。

从MD5切换到SHA1或SHA512不会如此大地提高构造的安全性。计算SHA256或SHA512哈希的速度非常快。具有通用硬件的攻击者仍然可以尝试每秒数千万(使用单个CPU)甚至数十亿(使用单个GPU)的哈希值。良好的密码散列函数包括减慢字典攻击的工作因素。

以下是PHP程序员的建议:阅读PHP FAQ然后使用password_hash()

© www.soinside.com 2019 - 2024. All rights reserved.