密码强度和密钥强度的关系

信息安全 加密 密码 密钥生成
2021-08-16 01:51:55

我刚刚开始自学密码学,虽然它大部分是有道理的,但仍有一些事情让我感到困惑。一个是:

在采用用户密码/短语来导出加密密钥的系统中,密码强度和密钥强度之间的关系是什么?我知道密码强度在身份验证中很重要;这是加密的一个有争议的问题吗?

据我了解,人为创建的密码往往具有非常低的熵,这就是从它们派生密钥的原因。假设密钥和算法都是(相对)安全的,加密是(相对)安全的。

但是,虽然那个 128 位(或其他)密钥可能一切都很好而且很花哨,但是如何防止攻击者通过密钥派生函数运行弱密码列表,然后尝试使用生成的密钥来解密消息?

我的预感是它与计算成本有关......但我很好奇使用字母“a”作为密码是否与使用超强密码一样安全 - 即如果派生无论输入如何,密钥都会一样强,密码的组成是否重要?

4个回答

概述

  1. 一些审查/讨论的例子。
  2. 替代方案:本地密码生成的密钥供内部在加密密钥访问控制 API 中使用。
  3. 熵和增加它。

1. 一些回顾/讨论的例子

在采用用户密码/短语来导出加密密钥的系统中,密码强度和密钥强度之间的关系是什么?

这完全取决于您如何使用密码来派生密钥。如果您只是对密码进行哈希处理,甚至对密码进行哈希处理和加盐,您的函数可能如下所示:

generateKey(password, salt) := cryptoHash(password, salt)

如果我拿一张最弱密码表,我可能可以计算出潜在的哈希值,并从那里得到可能的加密密钥。然后给出一个message我可以用这个函数破解它:

crack(message, saltLen, weakPassList):=
    for salt in 0..saltLen:
        for weak in weakPassList:
            let k := generateKey(weak, salt)
            if decrypt(message, k) looks okay:
                return k

根据大小saltLenweakPassList大小,这可能需要很长时间才能运行但是,您可以将k上面生成的内容缓存在一个表中,然后一次尝试一个,以消除实验性密钥生成的因素。

肯定有更好的方法来生成密码,但是如果没有更详细的规范或用例,就很难分析或推荐哪种方法最好。

2. 替代方案:本地密码生成密钥供内部在加密密钥访问控制 API 中使用。

我知道密码强度在身份验证中很重要;这是加密的一个有争议的问题吗?

除非您谈论的是特定的密钥生成方法或其他特定用例,否则我觉得没有区别。一把钥匙就是一把钥匙。

就我个人而言,我会使用密码生成本地加密密钥kLocal,用于隐藏正确生成的加密密钥kMessage,该密钥可用于加密通过非安全通道发送的消息。

这样密码只是一种访问控制机制,用于过滤可以向系统键入命令的用户,并防止他们使用彼此的加密密钥(如果他们无法获得权限kLocal,他们就无法发现其中的内容kMessage)。这是恰当的,因为您可以使用安全 API 和例如漏桶,以防止人们对本地计算机进行密码猜测攻击。

防止对已经公开发送的密文消息进行密码猜测攻击并不是那么简单!通过使生成的密码kLocal仅供内部、API 限制使用,您限制了攻击者的有效计算能力,这在软件安全方面是一件非常好的事情。

3.熵和增加它。

据我了解,人为创建的密码往往具有非常低的熵,这就是从它们派生密钥的原因。

当心!熵只是衡量事物不可预测的程度。如果我取一些带有X熵的值,并通过一些对手已知的函数运行它们,结果只能是X熵。也就是说,如果对手可以猜出原始值并且也知道操纵/扩展它们的功能,那么他就可以像猜测原始值一样轻松地猜测操纵/扩展的值。

除非您添加更多信息,否则您不会增加域的大小;并且你不会增加熵,除非你添加的信息本身有一些熵(不知何故不可预测/秘密)。

在采用用户密码/短语来导出加密密钥的系统中,密码强度和密钥强度之间的关系是什么?我知道密码强度在身份验证中很重要;这是加密的一个有争议的问题吗?

来自维基百科密码强度是衡量密码抵抗猜测和暴力攻击的有效性的指标。以通常的形式,它估计一个没有直接访问密码的攻击者平均需要多少次试验才能正确猜到密码。密码的强度是长度、复杂性和不可预测性的函数。

因此,您正确地推测密码强度与身份验证有关。如果我们使用加密散列函数(例如SHA-1 )扩展密码以匹配密钥大小,则密码的强度与加密无关。

但是,虽然那个 128 位(或其他)密钥可能一切都很好而且很花哨,但是如何防止攻击者通过密钥派生函数运行弱密码列表,然后尝试使用生成的密钥来解密消息?

时间成本是这种蛮力攻击的主要对手。

根据维基百科蛮力攻击所需的资源随着密钥大小的增加呈指数增长,而不是线性增长。尽管美国出口法规历来将密钥长度限制为 56 位对称密钥(例如数据加密标准),但这些限制已不再存在,因此现代对称算法通常使用计算能力更强的 128 至 256 位密钥。

同一页假设破解 128 位对称密钥(例如 AES)需要大约 10^18 焦耳的能量,或大约 30 吉瓦的功率持续一年。这是世界能源产量的百分之一以上。

当然,保证编码数据安全的唯一方法就是防止它落入恶意之手。

我的预感是它与计算成本有关......但我很好奇使用字母“a”作为“密码”是否与使用超强密码一样安全。

如果攻击者可以正确猜出您的加密密钥是从纯字符串派生的,并正确猜出原始字符串是“a”(或一些同样愚蠢的密码),那么您就有麻烦了。选择好的密码很重要。

您还可以采用一种称为“加盐”的策略,在密码中添加一些随机熵。salt 字符串通常存储在与密码相同的位置,并且不会被加密,因此如果您丢失了加密的客户数据数据库,它不会为您提供帮助;但是,如果攻击者通过身份验证访问您的数据,它将掩盖密钥派生过程,并且它将消除使用不同盐或无盐生成的任何预先计算的彩虹表。

可以采取一些措施来挫败攻击者。使用密钥派生函数的最佳实践是故意使派生函数变慢,以防止暴力攻击泄露输入值。使用盐(例如现代实现中的 64 位)连同输入值将用于使字典攻击复杂化。这种方法被称为“键拉伸”。

更进一步,“密钥强化”使用相同的技术,但另外安全地删除了强制攻击者以及用户对盐进行暴力搜索,从而使暴力攻击更加复杂。在这种情况下,一种可能的实现是将盐分为公共部分和私有部分,其中私有盐需要被暴力破解。给定正确的密码输入和公共盐暴力强制私人盐是可行的。但是,如果没有原始密码的暴力破解也必须计算私有盐,则会产生额外的障碍。

当然,所选输入值(通常是密码)的强度是安全性的重要因素。

我理解你的意思是,如果使用弱密码而不是强密码生成,有人可以直接对密钥使用强力攻击(不使用密码猜测来生成不同的密钥)更容易吗?如果这是您的问题,那么在绝大多数情况下(当然对于任何最近实施的密码系统)答案都不是。密钥是由密码和(在大多数情况下)一些随机“盐”的组合上完成的散列生成的(如其他答案所示),这只是当时生成的一些随机垃圾并存储在普通视图中。使用盐的唯一原因是为了让人们无法根据常用密码预先猜测密钥。但是,即使没有它,即使是 1 位密码生成的密钥也会产生一个看起来仍然是真正随机的密钥。这是因为现代哈希算法在从非常小的输入中产生随机垃圾方面非常有效。它们的设计使得即使更改一位也会导致完全不同的哈希。没有人能够看到这样的密钥并认为,哦,这是用弱密码产生的。

正如其他人所指出的,密码仍然非常重要。 密钥拉伸,即获取密码并通过哈希运行多次(可能数千次)以使其在计算上难以猜测大量密码的行为,可以帮助您,但就像其他一切一样,摩尔定律会降低价值. 我的意思是今天需要很多时间去做的事情,明天不一定需要很多时间。但是,对于任何现代密码系统,您都不必担心密钥会被直接攻击。只需选择一个好的密码。