基于芯片的银行卡通常使用 4 位 PIN。如果该卡无法防止暴力尝试,则最多需要几个小时才能尝试所有这些。该卡通过在连续 3 次失败后将自身变砖来防止暴力尝试。攻击者无法访问 PIN 的哈希值(卡中的物理保护使其极难读取其内存),但只能访问以 4 位数字作为输入并回复“是”或“不”。这里安全的关键是对手只能进行在线尝试,不能进行离线尝试。每次尝试都需要在防御设备上进行计算,而不仅仅是进行数学运算。
Android 手机或任何其他计算机都可以使用其存储加密密钥执行相同的操作。密钥不是从密码短语(或模式)派生的,而是存储在某处并使用密码短语加密。大多数存储加密系统都具有这种间接性,因此更改密码不需要重新加密整个存储,并且可以通过擦除构成加密密钥的几个字节来有效地擦除存储(存储加密密钥是均匀随机的) ,因此与从密码短语派生的密钥不同,它不受暴力破解:攻击者需要至少获得加密的存储密钥才能获得立足点)。
如果攻击者可以读取加密的存储密钥,那么他们可以在 PC 集群上对密钥进行快速暴力尝试。但如果存储密钥存储在防篡改存储中,则攻击者无法读取它,只能向设备提交密码尝试,因此设备可以应用“将尝试速率限制为每分钟 3 次”或“在 10 次尝试失败后需要第二个更长的密码”。
Android L 中的新功能是上游支持加密存储密钥,该密钥不存储在闪存中(可以通过一些焊接或 root 访问从闪存中转储),而是在一些受保护的内存中(可能只能在 TrustZone 安全模式下访问)。然而,并非所有运行 Android L 的手机都有这种受保护的内存,即使它存在,也不能保证它用于加密。所有 Android L 更改都提供了必要代码作为基本 Android 映像的一部分,使手机供应商更容易集成。
Android 提供了一个 API 来检查应用程序钥匙串存储是否在受保护的内存中)。不知道有没有对应的API来检查存储加密密钥的保护情况。