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

我正在做一个 php 登录,我正在尝试决定是否使用 SHA1或 Md5,或 SHA256,这是我在另一篇 stackoverflow 文章中读到的。他们中有谁比其他人更安全吗?对于 SHA1/256,我是否仍然使用盐?

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

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


$salt = createSalt();


$hash = sha1($salt . $hash);
162449 次浏览

都不是。你应该使用 bcrypt。您提到的散列都进行了优化,以便在硬件上快速简单,因此破解它们具有相同的质量。如果没有其他选择,至少要确保使用长的 salt 并多次重新散列。

在 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.
}

如果您使用的是旧版本的 PHP你真的应该升级一下,但是在此之前您可以使用 Password _ compat来公开这个 API。

另外,请让 password_hash()为您生成盐。它使用 CSPRNG

关于地下墓穴的两点警告

  1. Bcrypt 将静默截断任何长于72个字符的密码。
  2. Bcrypt 将在任何 NUL字符后截断。

(概念证明代表这里的两个警告。)

您可能希望通过 在通过 bcrypt 运行密码之前预哈希您的密码解决第一个警告,但是这样做可能会导致应用程序向前运行到第二个警告。

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

DR -使用 bcrypt

使用 SHA256。它并不完美,因为 SHA512是快速散列的理想选择,但是除了这些选项之外,它是明确的选择。根据任何散列技术,一定要在散列中加入盐,以增加安全性。

作为一个补充说明,FRKT,请告诉我在哪里有人可以轻松地破解一个盐 SHA256散列?我真的很想看看这个。

重要编辑:

接下来请使用 bcrypt作为硬化散列。更多信息可以使用 在这里发现的


关于盐渍的编辑:

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

正如约翰内斯 · 戈赛特所指出的,来自 Matasano 保安公司的 Thomas Ptacek解释了为什么 简单的、通用的哈希函数,例如 MD5、 SHA1、 SHA256和 SHA512,都是糟糕的密码哈希选择

为什么?它们太快了——用一台现代计算机,你可以计算出每个内核每秒钟至少1,000,000个 MD5哈希,所以对于大多数人使用的密码,使用暴力是可行的。这比一个基于 GPU 的破解服务器集群要少得多!

没有关键拉伸盐只意味着你不能预先计算彩虹表,你需要为特定的盐专门构建它。但这不会让事情变得更难。

用户@Will 说:

每个人都在谈论这个,好像他们可以被黑客攻击 如前所述,限制尝试使其不可能 在互联网上破解密码,并没有任何关系 大麻。

他们不需要知道。显然,在 LinkedIn 的案子中,他们使用通用的 SQL 注入漏洞来获得登录数据库表,并在脱机情况下破解了数百万个密码。

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

当整个数据库 然后黑客就可以执行1亿个密码 针对 md5散列每秒的尝试次数 慢一点。

不,SHA512并不比 MD5慢10000倍——它只需要大约两倍的速度。另一方面,Crypt/SHA512是一个非常不同的怪兽,就像它的 BCrypt 对应物一样,执行 拉伸键,产生一个非常不同的散列,内置一个随机盐,需要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)

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

盐是必须的,但是复杂性或者多重盐并不重要。任何单独的盐都可以阻止攻击者使用预制的彩虹桌。每个用户使用一个惟一的 salt 可以阻止攻击者创建一个新的彩虹表来对抗整个用户群。

当整个数据库受到攻击,黑客可以针对 md5散列每秒执行1亿次密码尝试时,安全性就真正发挥作用了。SHA512大约慢了10000倍。一个复杂的密码,如果使用 md5,仍然需要100年的时间,而使用 SHA512,则需要10,000倍的时间。盐根本不能阻止暴力,因为它们总是被知道,如果攻击者下载了你的数据库,他可能已经进入了你的系统。

我认为使用 md5或 sha256或任何为提高速度而优化的 hash 都是完全可以的,我非常好奇其他用户可能会有什么反驳。以下是我的理由

  1. 如果你允许用户使用弱密码,比如上帝、爱、战争、和平,那么无论加密如何,你仍然会允许用户输入密码,而不是哈希和这些密码经常被首先使用,因此这是 没有将与加密有任何关系。

  2. 如果您没有使用 SSL 或没有证书,那么监听流量的攻击者将能够获取密码,任何使用 javascript 或类似方法进行加密的尝试都是客户端的,很容易被破解和克服。同样,这也是 没有将与服务器端的数据加密有关。

  3. 暴力攻击将利用弱密码,因为你允许用户输入数据,如果你没有登录限制的3或甚至更多一点,那么问题将再次 没有与数据加密有任何关系。

  4. 如果您的数据库被破坏,那么很可能所有的东西都被破坏了,包括您的哈希技术,无论您使它多么神秘。同样,这可能是一个心怀不满的员工 XSS 攻击或 sql 注入或其他与密码加密无关的攻击。

我相信你还是应该加密但是我能看到加密的唯一作用就是阻止已经或者以某种方式进入数据库的人大声读出密码。如果有人未经授权访问数据库,那么你有更大的问题要担心这就是为什么索尼被采纳,因为他们认为一个加密的密码保护一切,包括信用卡号码它所做的只是保护一个领域,这就是它。

对于数据库中复杂的密码加密,我所能看到的唯一纯粹的好处是可以延迟员工或其他可以访问数据库的人只是读出密码的时间。因此,如果它是一个小项目或者其他什么东西,我不会太担心服务器端的安全问题,相反,我会更担心客户端可能发送到服务器的任何东西的安全问题,比如 sql 注入、 XSS 攻击或者其他你可能受到损害的太多方式。如果有人不同意,我期待着从客户端阅读超级加密的密码是必须的方式。

我之所以试图说明这一点,是因为人们往往认为加密的密码意味着他们不必担心密码被泄露,他们也不再担心网站的安全问题。

MD5是坏的,因为冲突问题-两个不同的密码可能生成相同的 md-5。

沙 -1应该很安全。你之所以存储了加盐的 sha-1版本的密码,是为了让你的服务器不把用户的密码保存在文件中,这样他们就可以和其他人的服务器一起使用了。否则,有什么区别呢?

如果黑客以某种方式窃取了你整个未加密的数据库,一个经过散列加盐的密码所做的唯一事情就是防止他为了以后的登录而假冒用户——黑客已经拥有了数据。

如果您的用户输入是一个普通的密码,那么使用散列值对攻击者有什么好处呢?

即使拥有未来技术的黑客可以在一秒钟内生成一百万个 sha-1密钥,你的服务器是否会在一秒钟内处理一百万个登录穷举法,以便黑客测试他的密钥?这是如果你让黑客尝试登录与盐的 sha-1,而不是像一个正常的登录密码。

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

人们似乎忽略了一点,如果黑客可以访问数据库,他可能也可以访问 php 文件,哈希密码,并可能只是修改,以发送给他所有成功的用户名密码组合。如果他没有访问网络目录,他总是可以选择一个密码散列它,并写入数据库。换句话说,散列算法实际上并不像系统安全性那样重要,如果你不使用 SSL,那么攻击者可以只是监听连接来获取信息,从而限制登录尝试。除非需要花很长时间来计算算法(为了您自己的目的) ,那么 SHA-256或 SHA-512与用户特定的盐应该足够了。

作为一项附加的安全措施,设置一个脚本(bash、 batch、 python 等)或程序,给它一个模糊的名称,让它检查 login.php 是否已经更改(检查日期/时间戳) ,如果有,就给你发一封电子邮件。也许还应该记录所有尝试登录与管理员权限和日志所有失败的尝试登录到数据库,并有日志电子邮件给你。

使用 Argon2i氩气2密码哈希功能赢得了密码哈希竞赛。

其他合理的选择,如果使用 氩气2是不可用的,是 脚本地下室PBKDF2。维基百科有这些功能的页面:

MD5、 SHA1和 SHA256是消息摘要,不是密码哈希函数。

从 MD5切换到 SHA1或 SHA512不会大大提高施工的安全性。计算 SHA256或 SHA512散列非常快。使用普通硬件的攻击者每秒钟仍然可以尝试数千万(使用单个 CPU)甚至数十亿(使用单个 GPU)散列。好的密码哈希函数包括一个减缓字典攻击的工作因子。

这里给 PHP 程序员一个建议: 阅读 PHP 常见问题解答然后使用 Password _ hash ()

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

MD5很弱,因为它简短而流行,实际上每一个没有密码的 hash 生成都是字典式攻击的弱点。但是。.

因此,假设我们仍然使用 MD5和 SALT。黑客不知道 SALT 但他们知道特定用户的密码。这样他们就可以测试?其中12345是已知密码?就是盐。黑客们迟早会猜到 SALT。

但是,如果我们使用 MD5 + SALT 并应用 MD5,那么就没有办法恢复信息。但是,我重复,MD5仍然很短。

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

Md5:827ccb0ea8a706c4c34a16891f84e7b

带有散列的 md5:56adb0f19ac0fb50194c312d49b15378

MD5和 md5上的 hash: 28a03c0bc950decdd9ee362907d1798a 我尝试使用这些在线服务,但是没有一个能够破解它。而且是唯一的 MD5!(可能是因为今天它将是可破解的,因为我生成的 md5在线)

如果你想过度杀伤,那么 SHA256是足够的,如果它应用与盐和两次。

Tldr MD5(HASH + MD5(密码)) = ok 但很短,SHA256就足够了。

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

enter image description here

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