2

我想存储敏感信息,例如登录 PIN。如今,有了EncryptedSharedPreferences (ESP),人们可以争辩说这就足够了。但是,假设我想提供使用Biometrics的可能性。这个谷歌示例向我们展示了如何使用BiometricPrompt.CryptoObject数据加密和解密。

但这提出了一个问题:
我是否应该在不增加另一层安全性的情况下将 PIN 保存在 ESP 中?

如果是这样,生物识别提示将作为一种更快、更方便的方式来插入 PIN。我只需要倾听onAuthenticationSucceeded忽略result: BiometricPrompt.AuthenticationResult并假设用户已登录(或使用保存在 ESP 中的 PIN 值执行 API 登录)。CryptographyManager如果我将 PIN 保存在 ESP 中,但通过( cryptographyManager.encryptData/ )的加密提供了额外的安全层,cryptographyManager.decryptData当用户手动插入 PIN 时我会遇到麻烦,因为我无法加密插入的数据和与加密存储的比较。在这种情况下,我将没有Cipher对象,因为没有BiometricPrompt(假设我想提供离线登录的可能性)。

也许我在这里遗漏了一步,但是将 PIN 存储在 ESP 中并仅使用生物识别技术进行“便捷登录”就足够了吗?

4

2 回答 2

2

加密您的加密共享首选项的密钥反过来使用主密钥进行加密。MasterKeys.getOrCreate将 aKeyGenParameterSpec作为其输入。

除了使用预定义MasterKeys.AES256_GCM_SPEC,您还可以使用您想要的设置构建您自己 KeyGenParameterSpec的设置,例如指定需要用户身份验证

请参阅此处的“对于需要额外安全性的用例,请完成以下步骤”下要点

于 2020-03-04T09:14:39.270 回答
1

我做了一个图书馆来做到这一点:

该库使用 livedata 将 androidx.security 与 androidx.biometric 合并使用setUserAuthenticationRequired

https://github.com/xanscale/LocalhostToolkit/tree/master/security

您可以在片段或活动中使用它

BiometricEncryptedSharedPreferences.create(
        this,
        "secret_shared_prefs",
        1,
        new BiometricPrompt.PromptInfo.Builder().setTitle(getString(R.string.app_name)).setDeviceCredentialAllowed(true).build()
).observe(this, it -> {
    it.edit().putString("secretValue", "IT works!").apply();
    System.out.println(it.getString("secretValue", "It didn't work"));
});
于 2020-05-06T21:58:52.403 回答