Android L 如何使用低熵密码实现强加密?

信息安全 安卓 磁盘加密
2021-09-03 17:07:05

在我的 Nexus 5 上升级到 Android L 后,我很高兴地发现我可以使用模式作为密码来启用加密。

然而,它很快让我思考。我猜加密密钥最终来自熵非常低的模式。我进行了粗略计算,发现 3x3 网格上的独特图案总数接近一百万。即使每秒猜测 0.1 次,搜索整个键空间也只需要 115 天。

我开始阅读并发现一篇文章,详细介绍了 Android 如何进行磁盘加密似乎声称 Android L 将使用硬件支持的安全存储来存储和派生加密密钥,因此它基本上可以允许低熵密码短语仍然具有相同的安全性。

但是,我不太明白为什么。为什么使用硬件支持的安全存储设备突然允许低熵密码短语实现强大的安全性?我只是错过了一些明显的东西吗?

4个回答

基于芯片的银行卡通常使用 4 位 PIN。如果该卡无法防止暴力尝试,则最多需要几个小时才能尝试所有这些。该卡通过在连续 3 次失败后将自身变砖来防止暴力尝试。攻击者无法访问 PIN 的哈希值(卡中的物理保护使其极难读取其内存),但只能访问以 4 位数字作为输入并回复“是”或“不”。这里安全的关键是对手只能进行在线尝试,不能进行离线尝试每次尝试都需要在防御设备上进行计算,而不仅仅是进行数学运算。

Android 手机或任何其他计算机都可以使用其存储加密密钥执行相同的操作。密钥不是从密码短语(或模式)派生的,而是存储在某处并使用密码短语加密。大多数存储加密系统都具有这种间接性,因此更改密码不需要重新加密整个存储,并且可以通过擦除构成加密密钥的几个字节来有效地擦除存储(存储加密密钥是均匀随机的) ,因此与从密码短语派生的密钥不同,它不受暴力破解:攻击者需要至少获得加密的存储密钥才能获得立足点)。

如果攻击者可以读取加密的存储密钥,那么他们可以在 PC 集群上对密钥进行快速暴力尝试。如果存储密钥存储在防篡改存储中,则攻击者无法读取它,只能向设备提交密码尝试,因此设备可以应用“将尝试速率限制为每分钟 3 次”或“在 10 次尝试失败后需要第二个更长的密码”。

Android L 中的新功能是上游支持加密存储密钥,该密钥不存储在闪存中(可以通过一些焊接或 root 访问从闪存中转储),而是在一些受保护的内存中(可能只能在 TrustZone 安全模式下访问)。然而,并非所有运行 Android L 的手机都有这种受保护的内存,即使它存在,也不能保证它用于加密。所有 Android L 更改都提供了必要代码作为基本 Android 映像的一部分,使手机供应商更容易集成。

Android 提供了一个 API 来检查应用程序钥匙串存储是否在受保护的内存中)。不知道有没有对应的API来检查存储加密密钥的保护情况。

我不知道这是否是 Android 的做法,但硬件支持的安全存储设备可以阻止过快的重复尝试,从而使您每秒猜测 0.1 次的假设无效。假设它最初允许每 0.01 秒尝试一次,但在前五次之后,每次失败的尝试之间的时间加倍。仅尝试 50 次后,您将不得不等待 25 万年才能再次尝试(而您需要 25 万年才能走到这一步)。但是,只要您始终可以在 10 次或更少的时间内正确输入您的密码,您就永远不会注意到任何延迟。

密钥的生成和密码的使用是两件不同的事情。密钥,例如在非对称密码学中,是使用来自计算机环境的熵生成的(例如/dev/urandom,它可能是也可能不是一个好的熵源,但这是另一个争论)。所以密钥本身与密码短语无关。密码短语将仅用于将密钥本身加密到设计用于存储密钥的容器中。

如果有人想解密你的磁盘数据,他们需要密钥。在适当的条件下,找到钥匙几乎是不可能的。如果处理得当,没有密钥也应该不可能破解密钥容器的加密。

关于暴力破解密钥,如果攻击者可以访问加密的密钥文件,考虑到低密钥空间,这实际上可能是一个微不足道的操作。它是负责使攻击者无法使用该加密密钥文件的设备。

从您的链接文章中,我读到:

在大多数商业设备上通常不可能获得磁盘分区的原始副本,但可以通过引导由设备制造商签名的专用数据采集引导映像来实现,利用引导加载程序中允许引导未签名映像的缺陷(例如作为这个),或者简单地通过在具有解锁引导加载程序的设备上引导自定义恢复映像(典型的“生根”第一步)。

这些攻击,即使不是不可能的,也需要一些投资(在时间或金钱方面)。所有的安全都是一种权衡。

我还读到:

假设实现类似于硬件支持的凭证存储,磁盘加密密钥应该由存储在 SoC 中的不可提取密钥加密密钥加密,因此获取加密页脚和加密用户数据分区的副本,并暴力破解锁屏密码不再足以解密磁盘内容。

这应该解决后一个问题。

我认为以下四种方法或多或少涵盖了可以做的所有可能性:

  • 使用昂贵的(就 CPU 时间而言)密钥派生函数。然而,以这种方式减缓攻击者的任何因素都会以同样的因素减缓合法攻击。实际上,攻击者将能够使用比单个移动设备上更多的 CPU 能力,并且攻击者等待答案的时间可能比用户在解锁设备时愿意等待的时间更长。正如您正确意识到的那样,这种方法需要的熵比一百万个不同的可能密码短语所能达到的要多。
  • 使用防篡改硬件。将密钥放入专门的硬件中,这会将尝试提取密钥的次数限制在指定的速率,并在尝试失败时降低该速率。在大量尝试失败后甚至可能破坏密钥。这仅适用于无法拆开此硬件并从内部提取密钥的对手。
  • 使用在线服务。如果您可以访问在线服务,那么该服务可以提供所需的部分计算并实施速率限制。不知情的 RSA 操作可以实现这一点,而不会将有关密钥或加密数据的任何信息泄露给在线服务。但不是很实用,因为每次您想要解锁设备时,设备可能都无法访问网络连接。
  • 使用量子记忆。这基本上是防篡改硬件的一种变体,但依靠量子物理学在最大尝试次数后强制破坏密钥。也是不切实际的,因为我认为没有人成功地设计出可以保存数据几乎足够长的时间以将其用于持久数据的量子存储器。

上述防篡改硬件听起来确实是最实用的方法。