SHA1 vs md5与SHA256:哪个用于PHPlogin?

我正在做一个PHPlogin,我试图决定是否使用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); 

都不是。 你应该使用bcrypt 。 你提到的哈希都是优化的,在硬件上是快速和容易的,所以破解他们共享相同的品质。 如果你没有别的select,至less一定要用长盐和重新散列多次。

在PHP 5.5+中使用bcrypt

PHP 5.5提供了密码散列的新function 。 这是现代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 ,则应该升级 ,但在使用之前,您可以使用password_compat来公开此API。

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

两个bcrypt的警告

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

(这里有两个注意事项的概念certificate 。)

在使用bcrypt运行密码之前,您可能会试图通过预先对密码进行预处理来解决第一个警告,但是这样做可能会导致您的应用程序第二次运行。

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

  • Zend\Crypt (Zend框架的一部分)提供BcryptSha
  • PasswordLock类似于BcryptSha但它也使用经过validation的encryption库来encryptionbcrypt哈希。

TL; DR – 使用bcrypt 。

我认为使用md5或sha256或任何哈希优化的速度是非常好的,我很好奇听到其他用户可能有任何反弹。 这是我的原因

  1. 如果你允许用户使用弱密码,比如上帝,爱情,战争,和平,那么无论你使用何种密码,你仍然可以允许用户input密码而不是密码,这些密码通常是先使用的,与encryption有关。

  2. 如果你没有使用SSL或没有证书,那么听stream量的攻击者将能够拉取密码,并且任何使用JavaScript或类似方法进行encryption的尝试都是客户端,很容易破解和克服。 再次,这与服务器端的数据encryption没有任何关系。

  3. 蛮力攻击将利用弱密码,再次因为你允许用户input数据,如果你没有login限制3,甚至更多一点,那么问题将再次没有任何数据encryption。

  4. 如果你的数据库受到威胁,那么无论你做了多么神秘的事情,最有可能的事情都被攻破了,包括你的哈希技术。 再次,这可能是一个不满的员工XSS攻击或SQL注入或其他一些攻击,与您的密码encryption没有任何关系。

我相信你仍然应该encryption,但唯一能看到encryption的是防止那些已经拥有或以某种方式访问​​数据库的人从大声读出密码。 如果是某人未经授权的数据库,那么你有更大的问题担心,这就是为什么索尼拿走了,因为他们认为encryption的密码保护包括信用卡号码,所有的一切是保护一个领域就是它。

我可以看到,在数据库中对密码进行复杂encryption的唯一好处是能够延迟员工或其他访问数据库的人员读取密码。 所以,如果这是一个小项目,或者我不担心服务器端的安全问题,我会担心更多的是保护客户端可能发送给服务器的任何东西,比如sql注入,XSS攻击或者其他方式可能会受到影响。 如果有人不同意,我期待着从客户端读取超级encryption密码的方式。

我之所以想明确这一点,是因为人们经常认为encryption的密码意味着他们不必担心被盗用,他们不再担心网站的安全问题。

正如Johannes Gorset指出的那样, Matasano Security的Thomas Ptacek的post解释了为什么简单的通用散列函数(如MD5,SHA1,SHA256和SHA512)是糟糕的密码散列select

为什么? 它们速度太快了 – 你可以用一台现代计算机每核至less计算1,000,000次MD5哈希值,所以对于大多数人使用的密码来说,powershell是可行的。 这比基于GPU的破解服务器集群要less得多!

没有关键拉伸的腌制只意味着你不能预先计算彩虹表,你需要为特定的盐特别build立它。 但是这不会使事情变得更加困难。

用户@威尔说:

每个人都在谈论这个问题,就像他们可以通过互联网黑客攻击一样。 如前所述,限制尝试使得不可能通过互联网破解密码,而与散列无关。

他们不需要。 显然,在LinkedIn的情况下,他们使用常见的SQL注入漏洞获取login数据库表,并破解数百万密码的离线。

然后他回到离线攻击的情况:

当整个数据库受到攻击,黑客可以每秒对md5哈希执行1亿次密码尝试时,安全性真正起作用。 SHA512慢了大约一万倍。

不, SHA512比MD5慢10000倍 – 只需要两倍左右。 另一方面, Crypt / SHA512是一个非常不同的野兽,就像它的BCrypt对象一样,它执行关键的拉伸 ,产生一个非常不同的散列,内置随机盐,并且会花费500到999999倍之间的任何东西来计算(拉伸是可调的)。

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

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

使用SHA256 。 这是不完美的,因为SHA512将是一个快速哈希的理想select,但出于select,它是一个明确的select。 根据任何散列技术,一定要加注散列以增加安全性。

另外请注意,FRKT,请告诉我哪里可以轻松破解一个SHA256哈希? 我真的很感兴趣,看到这一点。

重要编辑:

向前走,请使用bcrypt作为一个强化散列。 更多信息可以在这里find 。


编辑在腌制:

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

什么人似乎缺less的是,如果黑客有权访问数据库,他可能也有权访问密码的PHP文件,并可能只是修改,以发送给他所有成功的用户名密码组合。 如果他没有访问Web目录,他总是可以select一个密码来散列它,并将其写入数据库。 换句话说,哈希algorithm并不像系统安全那么重要,并且限制login尝试,如果你不使用SSL,那么攻击者就可以监听连接以获取信息。 除非您需要花费很长时间计算algorithm(出于您自己的目的), 否则使用用户特定的盐的SHA-256或SHA-512应该足够了。

作为一个额外的安全措施,build立一个脚本(bash,批处理,python等)或程序,并给它一个不起眼的名字,并检查,看看login.php是否已经改变(检查date/时间戳),并向您发送电子邮件如果有的话。 也应该logging所有尝试loginpipe理员权限,并logging所有失败的尝试login到数据库,并通过电子邮件发送给您的日志。

每个人都在谈论这个问题,就像他们可以通过互联网黑客攻击一样。 如前所述,限制尝试使得不可能通过互联网破解密码,而与散列无关。

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

当整个数据库受到攻击,黑客可以每秒对md5哈希执行1亿次密码尝试时,安全性真正起作用。 SHA512慢了大约一万倍。 一个复杂的密码与今天的力量可能还需要100年的时间才能使用md5,而使用SHA512将需要10000倍的时间。 这些盐并不能阻止暴力行为,因为他们总是要知道,如果攻击者下载了你的数据库,他可能已经在你的系统中了。

MD5,SHA1和SHA256是消息摘要, 而不是密码散列函数。

目前唯一的标准(如NIST认可的)密码散列或密钥派生函数是PBKDF2 。 其他合理的select,如果使用标准是不需要的,是bcrypt ,更新的scrypt和更新的氩气 。 维基百科有这些function的页面:

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

以下是PHP程序员的一些build议:阅读PHP常见问题: http : //php.net/manual/en/faq.passwords.php然后使用下列其中一个:

  • 标准的PHP crypt()函数: http : //fr.php.net/crypt :
  • PHPPASS: http : //www.openwall.com/phpass/
  • PasswordHash: https : //crackstation.net/hashing-security.htm

这里是MD5和SHA1的比较。 你可以清楚地知道哪一个更好。

在这里输入图像描述

由于碰撞问题MD5是坏的 – 两个不同的密码可能会产生相同的MD – 5。

沙1将是很多的安全。 您存储sha-1版本密码的原因是,swerver不会将用户的apassword保存在文件中,而是可能与其他人的服务器一起使用。 否则,它有什么不同?

如果黑客窃取了你的整个未encryption的数据库,那么哈希密码做的唯一的事情就是防止他冒充未来login的用户 – 黑客已经拥有了数据。

如果你的用户input的是一个简单的密码,攻击者有什么好的散列值?

而即使具有未来技术的黑客每秒钟可以产生一百万次sha-1密钥来进行蛮力攻击,你的服务器每秒钟处理一百万次login是否会让黑客testing密钥? 这就是说,如果让黑客尝试使用sal-sha-1而不是像正常login那样的密码login。

最好的办法是限制不良login尝试到一些合理的数字 – 例如25,然后计时用户一两分钟。 如果累计badylogin尝试在24小时内达到250,请closures帐户访问权限并发送给所有者。

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

由于MD5短而stream行,而且实际上每一个没有密码的散列代码都是字典攻击的弱点,因此MD5很脆弱。 但..

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

但是,如果我们使用了MD5 + SALT并且我们应用了MD5,那么就没有办法恢复这些信息。 不过,我再说一遍,MD5依然很短。

例如,假设我的密码是:12345.盐是BILLCLINTON

md5:827ccb0eea8a706c4c34a16891f84e7b

md5与哈希:56adb0f19ac0fb50194c312d49b15378

md5与散列在md5:28a03c0bc950decdd9ee362907d1798a我试图使用这些在线服务,我发现没有能够破解它。 而它唯一的MD5! (可能会像今天这将是易碎的,因为我生成在线MD5)

如果你想过度杀伤,那么SHA256如果使用盐和两次是绰绰有余。

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