散列密码以增加熵

信息安全 密码 哈希
2021-09-07 03:51:50

在应用程序中使用密码以增加密码熵之前散列密码是否安全?

当应用程序本身使用 PBKDF 时,这种做法会增加熵还是 PBKDF 本身会增加密码熵?

如果使用 md5 对随机密码进行哈希处理,输出是否会提供 128 位熵?

编辑:它旨在使用哈希函数的结果作为密码函数和应用程序(如 AES-256、电子邮件和访问计算机系统)的密码。

使用的过程将是密码 -> 密码哈希 -> 应用程序

编辑 2:例如,如果电子邮件应用程序在注册期间要求输入密码,则在提供给它之前,预期的密码将在本地进行哈希处理。

3个回答

不,你不会通过散列一次、两次或十次来增加熵。考虑输入的熵,而不是输出的熵。您不能使用确定性过程添加熵,因为结果的熵不计算在内。

即使你有这样的代码:

$password = "123456";
$result = md5($password) . sha1($password) . hash('gost', $password);
echo $result;  //   e10adc3949ba59abbe56e057f20f
// 8941b84cdecc9c273927ff6d9cca1ae75945990a2cb1f
// 81e5daab52a987f6d788c372

最后你会得到一个看起来很吓人的 136 字节字符串,密码仍然是123456,任何攻击者暴力破解你的哈希密码平均只需要尝试一次,123456几乎每个列表中最差的密码也是如此。

如果使用 md5 对随机密码进行哈希处理,输出是否会提供 128 位熵?

不,MD5 是确定性的,所以如果攻击者知道字符串是一个 MD5 哈希,它的熵就是你提供的随机密码的熵。

为了使密码更安全,使用适当的密钥派生(PBKDF2是一个很好的),要求用户提供更长的密码,并检查用户是否遵循基本密码规则(连续没有重复的字符,适当的长度,混合数字和字符,大小写混合,诸如此类)。

密钥推导函数不会增加熵,但它确实使事情更安全。KDF 具有以下功能:

  • 它创建一个正确长度的密钥。许多加密算法采用固定大小的长度,例如 16 字节。通过使用 KDF,您可以使用任意长度的密码。
  • 它将密码的熵分布在整个密钥上。加密算法旨在使用看起来随机的密钥。如果您使用1000000000000000as key,这可能会在加密算法中引入安全问题。KDF 将密码打乱成看起来随机的密钥。
  • 这需要时间。为了减缓蛮力攻击,可以使密钥派生速度变慢,这样尝试多个密码就会花费不合理的时间。

TL;博士

在将错误密码作为密码发送到某些服务器之前对其进行散列处理比简单的密码管理器更耗时、不舒服且安全性更低。

该问题似乎旨在滥用散列算法作为一个非常简单的密码管理器。

使用真正的或任何真正的密码管理器。

我将使用您的示例来说明为什么这是一个坏主意:

  • 你的密码不是那么“丰富”的密码 1111111111111
  • 它将具有哈希 9DCBF642C78137F656BA7C24381AC25B

现在,攻击者以某种方式获得了一个密码为明文的数据库(过去经常发生)。以及为什么他会不小心在那里搜索知道明文的哈希(不那么“熵丰富”的密码就是其中之一)。现在他知道使用您的用户名/电子邮件的用户使用“1111111111111”,然后使用 MD5 作为密码。那你有什么好处呢?有人必须再迈出一步,但在安全方面并没有真正的区别。

现实世界中可能发生的差异在这里:

你的方式:

ClearText -- MD5 --> HashedClearText -- 发送到服务器(HTTP(S))-->| |-- MD5/SHA*/... --> HashedHashedClearText

正常方式:

明文 -- 发送到服务器(HTTP(S)) -->| | -- MD5/SHA*/... --> HashedClearText