用户名、密码、加盐、加密、哈希 - 这一切是如何工作的? [复制]

Posted

技术标签:

【中文标题】用户名、密码、加盐、加密、哈希 - 这一切是如何工作的? [复制]【英文标题】:Username, Password, Salting, Encrypting, Hash - How does it all work? [duplicate] 【发布时间】:2013-01-04 03:49:06 【问题描述】:

可能重复:Secure hash and salt for php passwords

我在 *** 和其他网站上阅读了很多关于网络安全的帖子。例如加盐加密等。我有点不明白,所以简单的解释会很有帮助。

这就是我目前所知道的。用户登录输入他的用户名和密码。然后输入经过一个过程。假设用户名和密码组合在一起,例如:

$username = (USERS USERNAME INPUT);
$password = (USERS PASSWORD INPUT);
$userinput = $username . $password;

然后我们加点盐。

$salt1 = "13$13aVc!kd";
$salt2 = "4kr$!vlmeoc";

$salted = $salt1 . $userinput . $salt2;

然后我们对其进行加密。

$encrypted = encrypt($salted);

然后检查数据库,看看它的正确用户是否已登录。

这就是它的工作原理吗?但我读过关于蛮力攻击的文章。它猜对了输入值吗?用上面的程序。不是说明攻击者只需要正确获取$userinput信息就可以进入吗?他不用猜那长长的$encrypted字符串正确吗?

注意:假设在这种情况下,没有验证码,没有尝试次数限制,没有锁定,除了上述之外没有别的。

注意:要温柔,我还在学习。

【问题讨论】:

这就是为什么建议用户使用强密码而不是“12345”但在您的场景中可以使用暴力破解.. 所以盐和加密没用? 排序,但是如果在两者之间被劫持,发布日期对劫持者没有用处,因为它将是加密字符串,并且在他没有盐值之前无法反转。 salt 和加密并不是没用的——它们可以在数据库泄露的情况下保护用户密码......畅通无阻的蛮力基本上可以打开任何东西......及时;) 写了一篇关于secure password storing的教程,也许对你有帮助。 【参考方案1】:

如果您排除验证码,请尝试限制、锁定等...然后可以。你只需要暴力破解纯文本字符串。

但是,这确实需要 时间 - 至少,它受到服务器响应登录请求的速率的限制。即使开发者不添加任何防止暴力破解的措施,服务器本身也只能这么快的完成加密+验证的过程,只能处理这么多的并行请求。

也就是说,这就是为什么它很重要

作为用户,请使用强大、难以破解的密码 作为开发人员,有足够的措施来防止您的登录过程被暴力破解

散列和加盐密码并不是为了防止那些暴力破解自然登录过程的人(还有其他东西可以防止这种情况发生)。相反,它们是为了防止密码存储本身的潜在危害(例如,有人转储数据库的内容)。

散列和加盐都用于降低 速度 访问存储密码的人可以检索他们需要能够通过自然登录过程的纯文本字符串(您的网站或其他网站,因为密码通常在网站之间共享)而不会触发反暴力破解安全措施。

【讨论】:

@user1429811 如果您想阅读更多内容,我在这里有一篇关于这个主题的完整博文 - codingkilledthecat.wordpress.com/2012/09/04/…【参考方案2】:

散列和加盐的想法更多是为了防止有人在数据库本身受到破坏时获取用户密码。如果密码存储为加盐和散列的字符串,攻击者就不能只使用它们来访问另一个站点上的用户帐户。

【讨论】:

【参考方案3】:

密码加密是单向加密(或者更确切地说,它假设在安全站点中)。也就是说,您获取密码并对其进行哈希处理。例如,bcrypt 是当今可接受的标准。

如果它是单向加密,很多人想知道它如何检查密码。但是您只需对用户提交的密码进行哈希处理,并将其与您存储在数据库中的哈希值进行比较。这样,如果您的数据库被盗,攻击者必须更加努力。

仅散列密码的问题很容易被暴力破解或彩虹表。您可以谷歌彩虹表以了解更多信息。但本质上它是一种将这些哈希值转换回密码的方法。

加入盐腌。加盐基本上是在每个密码中添加随机数据。这胜过彩虹表。这意味着受损的数据库将意味着蛮力。如果你使用的是像 bcrypt 这样的哈希系统,那么被攻击者需要花费大量的时间和精力。

说了这么多。最好不要重新发明***。如果可以,请使用已知良好的授权系统。

【讨论】:

【参考方案4】:

看我的回答here

并且您应该在创建哈希时为每个条目生成唯一的盐。

【讨论】:

【参考方案5】:

蛮力攻击的一个问题是当您使用 SHA1 或 MD5 等快速加密时。构建这些函数是为了通过算法快速运行密码。相反,您可以使用我不是专家的 Blowfish 方法,但长话短说,它需要比 SHA1 或 MD5 更多的计算来计算返回值。这意味着暴力破解密码可能需要 5 年,由于计算时间的原因,使用 Blowfish 进行哈希处理。

下一个例子是用 SHA1 和 MD5 制作的,所以它很容易受到暴力攻击,但是盐部分应该可以使用:

$salt = md5(microtime().uniqueid());

这将输出一个唯一的 32 个字符的 salt,您将把它与密码放在一起。

$passwod = $_POST['password'];
$hashed_password = sha1($password.$salt);

现在您必须将密码和盐值都存储在数据库中。当你检查用户输入的密码时,你会得到盐,并对整个事情进行哈希处理。

$temp_pass = $_POST['temp_pass'];
$salt = //from database;
$database_pass = //hashed pass from database;

$hashed_temp_pass = sha1($temp_pass.$salt);

if(hashed_temp_pass == $database_pass)
//Welcome user!

else
//go away

【讨论】:

以上是关于用户名、密码、加盐、加密、哈希 - 这一切是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的方式搞定密码的加盐哈希与验证

什么叫给密码“加盐”?如何安全的为你的用户密码“加盐”?

加盐加密的介绍

如何安全的存储用户密码?

Python-flask建立用户登录时密码加密方法

如何迁移密码哈希?