KeePass 主密钥派生如何提高安全性?

信息安全 密码 应用安全 密码管理
2021-08-28 21:38:00

我根本不明白 KeePass 密钥派生如何提高密码数据库的安全性。首先,我将尝试解释我从这里描述的密钥推导中所理解的内容。我将使用一些伪代码:

const WORKFACTOR = 6000;

var userKey = UserEnteresPassword();
var userKeyHash = SHA256(userKey);

var randomKey = GetStoredSecureRandomKey();

var tmpKey = userKeyHash;
for(i = 0; i < WORKFACTOR; i++)
{
    tmpKey = AES(tmpKey, randomKey);
}

var finalKey = SHA256(tmpKey);

然后它使用 finalfinalKey来加密密码数据库。然后将其存储在硬盘驱动器上。

如果我现在想解密密码数据库,为什么我必须使用这个密钥派生函数?我可以简单地直接猜测finalKey而不是猜测userKey并让它通过这个函数运行。所以我会节省所有我本来需要这个密钥派生函数的时间。

我知道,如果我只是猜测finalKey我将无法获得userKey,但我不需要它,因为我已经拥有了finalKey,我可以简单地解密密码数据库。我一点都不感兴趣userKey

或者这完全是关于字典攻击以防止攻击使用众所周知的单词/密码并简单地查看数据库是否解密?

3个回答

密钥派生完全是获取用户密码并将其转换为 256 位长密钥以使用它的长度,并希望以安全的方式使用。

如果运行纯蛮力,是的,可以通过循环遍历所有可能的 256 位长的模式来直接猜测密钥,因为这个人希望确保密钥派生不能缩小可能的密钥空间,因此所有 256 位长的密钥都是仍有可能。

可以尝试运行字典攻击并通过密钥派生函数传递所有字典单词以生成密钥以尝试密钥派生的要点之一是使其足够慢以至于这在给定的硬件上是不明智的。

现在,您提供的伪代码中存在一些缺陷,具体取决于几个函数(CreateSecureRandomKey() 每次打开数据库时都需要提供相同的数据以获取相同的密钥),我不确定我必须自己研究 KeePass 中的密钥派生。

看看暴力破解 finalKey 有多难:

2 256 = 2 64 4

2 64 ~= 4 * 10 9

您可以拥有四个 1000x1000x1000 处理器的立方阵列,每个阵列以 4 giga-guesses/sec 的速度运行 125 年,而您猜测它的机会将比中彩票低一百倍。

使用原始密码几乎肯定会使暴力破解变得更容易。很少有人使用随机生成的 64 位十六进制数字 (64 = 256 / 4) 字符串作为常规 KeePass 密码。

这称为键拉伸。您可以在Wikipedia 文章中阅读所有相关信息。