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

Ton*_*ark 132 php md5 sha1 login sha256

我正在进行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);
Run Code Online (Sandbox Code Playgroud)

Joh*_*set 106

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

在PHP 5.5+中使用bcrypt

PHP 5.5提供了密码散列的新功能.这是现代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.
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本的PHP,那么您确实应该进行升级,但在此之前,您可以使用password_compat来公开此API.

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

bcrypt的两个警告

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

(这里有两个警告的概念证明.)

您可能想通过在通过bcrypt运行密码之前预先解密密码来解决第一个警告,但这样做会导致您的应用程序首先运行到第二个密码.

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

TL; DR - 使用bcrypt.

  • @Cypher:`bcrypt`的目的是为了同样缓慢破解. (10认同)
  • 你能详细说说吗?什么是bcrypt?我没有看到任何好的在线例子...... (9认同)
  • 它自PHP 5.3起包含在"crypt"函数中.如果你有一个早期版本,我会查看"phpass"框架,以获得下一个最好的东西. (4认同)
  • 是.我指的是SHA1,SHA256和MD5以及一系列针对速度进行了优化的其他哈希.您不希望使用针对速度优化的哈希来保护密码.有许多好文章讨论了为什么,我特别喜欢这个:http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-对知识有关,s.html (3认同)
  • @Stanislav Palatnik SHA512是个不错的选择.别误会我的意思; 我不是说拉伸和盐渍的SHA512哈希是不安全的.这很安全.即便如此,事实仍然是bcrypt*更安全,所以我认为没有理由不使用它. (3认同)

Rog*_*son 22

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

  1. 如果允许用户使用弱口令如神,爱情,战争,和平那么无论你仍然会允许用户键入密码加密不是哈希和这些密码往往是第一次使用,因此这是打算与加密有关.

  2. 如果您没有使用SSL或没有证书,那么收听流量的攻击者将能够提取密码,并且任何使用javascript等加密的尝试都是客户端,并且很容易破解和克服.再次,这是打算有任何瓜葛与服务器端的数据加密.

  3. 因为你允许用户输入数据,如果你不具备的3登录限制,甚至更多一点,那么问题将再次强力攻击会利用弱口令,并再次具有任何与数据加密.

  4. 如果您的数据库受到损害,那么很可能一切都已被破坏,包括您的散列技术,无论您制作它有多么神秘.同样,这可能是一个心怀不满的员工XSS攻击或SQL注入或其他与您的密码加密无关的攻击.

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

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

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

  • 这真的是误导了.当然,数据库中的安全散列密码不会提高应用程序级别或数据库级别的安全性.对于安全而言,这并不是一件容易的事.您希望在数据库中安全地哈希用户密码有两个原因; 首先,客户信任您的密码,他们可能会或可能不会在其他网站上使用,因此您要确保这是不可恢复的,即使您的数据库遭到入侵,其次,您希望在安全的情况下免除责任违约.我不知道有任何诉讼,但泄露密码会让你的公司看起来很糟糕. (14认同)
  • 这是一个糟糕的建议.如果有人窃取了您的数据库并获取了所有哈希密码,即使他们还破坏了数据库的其他部分,防止他们破解密码并登录仍然很重要.(例如,想想一个银行网站.)速度优化算法使攻击者能够针对被盗的哈希测试许多候选人,直到找到匹配为止.像bcrypt和scrypt这样的算法使得候选对抗哈希变得缓慢且昂贵,即使他们知道你使用什么算法.因此,如果有人偷走了哈希,他们会给予更好的保护. (6认同)
  • "如果你的数据库受到损害,那么很可能一切都已被破坏,包括你的散列技术,无论你做多么神秘." 这就是为什么**bcrypt如此重要.使用bcrypt,如果某人有哈希值并不重要.使用像SHA1/MD5这样的快速哈希算法,它确实如此. (6认同)

Lex*_*ius 15

正如Johannes Gorset指出的那样,来自Matasano Security的Thomas Ptacek的帖子解释了为什么简单的通用散列函数(如MD5,SHA1,SHA256和SHA512)是不良的密码散列选择.

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

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

用户@Will说:

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

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

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

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

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

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Run Code Online (Sandbox Code Playgroud)

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


Kyl*_*ndo 13

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

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

重要编辑:

向前移动请使用bcrypt强化哈希.更多信息可以在这里找到.


盐渍编辑:

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

  • 事实仍然是,这是为了保护密码.通过使用带有salt的哈希,然后在网站上添加3次尝试限制,可以大大减慢黑客的攻击速度(甚至是暴力破解者).使用任何纯加密,您现在有另一个问题 - 保护密钥.如果找到密钥,则整个数据库都会被泄露(如果没有添加盐).但是,您将永远不会从系统中获取原始密码,这就是它应该如何. (6认同)