假设在 Android 应用上,用户必须在启动时输入 6 位 PIN。假设我们在这个应用程序中有一些我们想要加密的敏感数据。
我会这样做的方式是:
- 使用密钥派生函数(例如 PBKDF2),我们从 PIN 生成密钥。
- 使用密钥(以及像 CBC+padding 这样的配置)使用 AES 加密敏感数据。
- 将加密数据存储在任何地方,例如在共享首选项中。
我在这里看到的主要问题:6 位 PIN 的原始 PIN 空间是 10^6,这对于用作加密的基础来说太小了……
我们真的可以对此进行微调,以使存储的数据在一段时间内相当安全吗?
即使我们调整我们的 KDF 使得一个简单的推导需要 1 秒(我认为我们不能期望我们的用户在应用程序启动期间等待更长的时间),那么通过其中的 1'000'000 只需要 11.5 天(假设与手机相同的处理能力,这不太可能......)。
限制:
显然,使用更长/更强的 PIN会有所帮助 - 但遗憾的是,即使是 6 位数的 PIN 也会被用户视为障碍,因此这不太可能是一种选择。此外,KDF 强度受到我们可以预期用户在应用程序启动期间等待的时间量的限制,我会说这是 1 秒的数量级。