用户名,密码,盐渍,加密,哈希 - 它们如何运作?

时间:2013-01-21 04:48:40

标签: php mysql security web passwords

  

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

我已经在stackoverflow和其他网站上阅读了很多关于网络安全的帖子。比如加盐加密等等。我有点没有得到它,所以一个简单的解释会非常有用。

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

$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信息即可进入?他不需要猜测长$加密字符串是否正确?

注意:让我们说在这种情况下没有验证码,没有尝试次数限制,没有锁定,除了上面的那个之外别无其他。

注意:要保持温和,我还在学习。

5 个答案:

答案 0 :(得分:8)

如果排除验证码,请尝试限制,锁定等等......然后是。你只需要强制使用纯文本字符串。

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

那就是说,这就是

重要的原因
  • 作为用户,请使用强大,难以强制使用的密码
  • 作为开发人员,有足够的措施来防止强制登录过程

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

哈希和salting都可以降低速度,在这种情况下,有权访问存储密码的人可以检索他们需要能够通过自然登录过程的纯文本字符串(您的网站或其他网站,因为密码通常在网站之间共享),而不会绊倒反暴力安全措施。

答案 1 :(得分:2)

散列和腌制的想法更多是为了防止有人在数据库本身受到威胁时使用用户密码。如果密码存储为salted和散列字符串,则攻击者不能仅使用它们访问另一个站点上的用户帐户。

答案 2 :(得分:1)

密码加密是单向加密(或者更确切地说,它假定位于安全站点中)。也就是说你拿密码然后用它做一个哈希表。例如,bcrypt是今天这样做的可接受的标准。

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

只是哈希密码的问题很容易被强制或彩虹表格。您可以谷歌彩虹表了解更多相关信息。但实质上它是将这些哈希变回密码的一种方式。

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

说完了这一切。最好不要重新发明轮子。如果可以,只需使用已知的良好授权系统即可。

答案 3 :(得分:0)

请参阅我的回答here

在创建哈希值时,应为每个条目生成唯一的salt。

答案 4 :(得分:0)

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

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

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

这将输出一个独特的32 charecter salt,您将与密码一起放入。

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

现在您必须将密码和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
}