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

2022-08-30 06:59:10

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

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

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

$salt = createSalt();

$hash = sha1($salt . $hash);

答案 1

也不。您应该使用 .您提到的哈希值都经过优化,可以在硬件上快速轻松地使用,因此破解它们具有相同的质量。如果您别无选择,至少要确保使用长盐并多次重新散列。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.
}

如果您使用的是较旧版本的PHP,则确实应该升级,但在升级之前,您可以使用password_compat来公开此API。

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

bcrypt的两个警告

  1. Bcrypt将以静默方式截断任何长度超过72个字符的密码。
  2. Bcrypt 将在任何字符之后截断。NUL

(此处两个警告的概念证明

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

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

TL;DR - 使用 bcrypt


答案 2

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

  1. 如果您允许用户使用弱密码,例如上帝,爱情,战争,和平,那么无论加密如何,您仍然允许用户输入密码而不是哈希值,并且这些密码通常首先使用,因此这与加密没有任何关系。

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

  3. 暴力攻击将利用弱密码,并且由于您允许用户输入数据,如果您没有3甚至更多的登录限制,那么问题将再次与数据加密无关

  4. 如果您的数据库受到损害,那么很可能所有内容都已受到损害,包括您的哈希技术,无论您做得多么隐晦。同样,这可能是不满的员工XSS攻击或sql注入或其他与您的密码加密无关的攻击。

我确实相信你仍然应该加密,但我唯一能看到加密做的是防止已经或以某种方式获得数据库访问权限的人大声朗读密码。如果是未经授权在数据库上的人,那么你有更大的问题要担心,这就是为什么索尼被拿走了,因为他们认为加密密码保护了包括信用卡号在内的所有内容,它所做的就是保护一个字段。

对于数据库中的密码的复杂加密,我能看到的唯一纯粹好处是延迟员工或有权访问数据库的其他人只读出密码。因此,如果这是一个小项目或我不会太担心服务器端的安全性,相反,我会更担心保护客户端可能发送到服务器的任何内容,例如sql注入,XSS攻击或您可能受到损害的许多其他方式。如果有人不同意,我期待从客户端阅读一种必须使用超级加密密码的方法。

我想尝试明确这一点的原因是,人们经常认为加密密码意味着他们不必担心它被泄露,他们不再担心保护网站。


推荐