1

我引用了这个答案:https ://stackoverflow.com/a/4766811/1114105

我们重新对密码进行哈希处理,但实际上我们并没有对哈希做任何事情(我们在 CheckPassword 函数中使用 POST 提交的明文密码进行身份验证)。黑客不能绕过重新散列部分吗?

下面是我的伪代码。

如果密码/用户名由 POST 提交,并且 $row['password'] 是 sql 中的散列密码。

$t_hasher = new PasswordHash(13, FALSE);
$hash = $t_hasher->HashPassword($_POST['password']);
$check = $t_hasher->CheckPassword($_POST['password'], $row['password']);
if($check) Great success else Wrong credentials`

注意:我发现工作因素对 CheckPassword 运行的时间没有影响。它只会增加 HashPassword 的时间。

4

3 回答 3

1

那么有两种类型的针对密码的攻击:

  1. 攻击者可以以某种方式读出您存储在数据库中的密码哈希(SQL 注入或任何其他方式来访问您的系统)。攻击者现在想要获得原始密码(因为散列的密码不会让他走远)。
  2. 攻击者使用不同的密码(暴力破解)反复使用您的登录表单。

万一他已经绕过了你的登录表单,他不在乎在你的系统上一次登录需要多少时间。但他关心在他的系统上暴力破解密码需要多少时间。因此,工作因素只是通过尝试每种组合并使用与您的系统相同的算法对其进行散列来使密码更难暴力破解。在这种情况下,“重新散列”密码以延长登录过程将无济于事。

但是,在情况 2 中,他确实关心在您的系统上尝试密码需要多少时间,因为他必须做很多事情才能获得正确的登录名(另外,如果他找不到用户名,他可能必须猜测用户名)。攻击者一定很笨,因为他会留下痕迹,浪费时间。您可以通过在一定次数的登录失败后阻止他的 IP 来让他的生活更加悲惨。另外,您可以sleep在每次无效登录后添加一个(睡眠不需要像 CPU 密集型散列操作那样多的资源)。

于 2011-12-27T06:52:52.037 回答
-1

增加成本:

php 中的示例代码:

$hash = "你好"

$hash = password_hash($password, PASSWORD_DEFAULT,array('cost'=>15));

回声$哈希;

var_dump(password_verify($password, $hash));

因此 15 的成本需要大量时间来散列和破解它

上面的示例显示了哈希过程以及验证哈希以进行身份​​验证的方法,因为

“BCRYPT 每次运行都会创建新的哈希值!!!”

将此代码放入 .php 文件中,然后运行它也检查您的代码是否正在运行

不要忘记 < ?php ? >

于 2019-01-01T16:14:47.343 回答
-2

没有哈希算法是安全的 IMO,但是有一些可以减慢黑客的速度,我们唯一的希望是他们能偷看它......

于 2011-12-27T06:15:02.613 回答