在 Android 上通过生物识别或应用密码保护私钥
Protect private key by biometrics OR app-passwort on Android
对于对要发送到服务器的数据进行签名的应用程序,我正在研究保护用于签名的私钥的方法。
这个私钥的 material 最好永远不要暴露给应用程序,签名应该在 Android 的可信执行环境 (TEE) 中完成。
该应用需要通过生物识别或应用密码来保护对密钥的访问。应用程序密码而不是设备 PIN/pattern/password 因为我可以在设备 PIN/pattern/password 可能很弱的情况下对强度施加限制。
添加另一个生物识别 fingerprint/face 时,该应用程序会提醒用户并要求应用密码来签署数据并允许重新启用生物识别。 app-password 将作为后备和授权给不想在他们的设备上使用生物识别的用户。
目标平台为 Android 8 及以上。
我从 here 了解到,使用生物识别技术保护密钥 material 是(相对)直接的:
- 使用密钥库实例创建密钥 "AndroidKeyStore"
- 使用
setUserAuthenticationRequired(true)
保护私钥
生物识别提示。
- 在键上使用
setUserAuthenticationValidityDurationSeconds(-1)
以避免
允许使用(可能较弱的)设备访问密钥 pattern/password/pin.
- 在
时使用setInvalidatedByBiometricEnrollment(true)
使密钥失效
另一个 fingerprint/face 已注册设备生物识别。
- 最后,在
onAuthenticationSucceded
回调中使用 CryptoObject
签署数据。
密钥 material 永远不会直接暴露给应用程序,并且在 TEE 中得到很好的保护。
现在说到使用应用程序密码保护私钥的部分——我被打动了:有没有办法用密码保护密钥(所以我们有一个非生物识别的回退) AND 具有相似的保护属性,即私钥 material 保存在安全的 TEE KeyStore 中,不会暴露给应用程序?
你不能那样做,因为那个密钥库没有密码。您唯一的选择是添加 2 个密钥(它们可能需要相同的密钥 material);一个带有 setUserAuthenticationRequired(true)
,另一个带有 setUserAuthenticationRequired(false)
...否则您始终需要提供生物识别身份验证才能继续,因为此标志一旦设置就不是可选的。
对于对要发送到服务器的数据进行签名的应用程序,我正在研究保护用于签名的私钥的方法。 这个私钥的 material 最好永远不要暴露给应用程序,签名应该在 Android 的可信执行环境 (TEE) 中完成。
该应用需要通过生物识别或应用密码来保护对密钥的访问。应用程序密码而不是设备 PIN/pattern/password 因为我可以在设备 PIN/pattern/password 可能很弱的情况下对强度施加限制。
添加另一个生物识别 fingerprint/face 时,该应用程序会提醒用户并要求应用密码来签署数据并允许重新启用生物识别。 app-password 将作为后备和授权给不想在他们的设备上使用生物识别的用户。
目标平台为 Android 8 及以上。
我从 here 了解到,使用生物识别技术保护密钥 material 是(相对)直接的:
- 使用密钥库实例创建密钥 "AndroidKeyStore"
- 使用
setUserAuthenticationRequired(true)
保护私钥 生物识别提示。 - 在键上使用
setUserAuthenticationValidityDurationSeconds(-1)
以避免 允许使用(可能较弱的)设备访问密钥 pattern/password/pin. - 在
时使用setInvalidatedByBiometricEnrollment(true)
使密钥失效 另一个 fingerprint/face 已注册设备生物识别。 - 最后,在
onAuthenticationSucceded
回调中使用 CryptoObject 签署数据。
密钥 material 永远不会直接暴露给应用程序,并且在 TEE 中得到很好的保护。
现在说到使用应用程序密码保护私钥的部分——我被打动了:有没有办法用密码保护密钥(所以我们有一个非生物识别的回退) AND 具有相似的保护属性,即私钥 material 保存在安全的 TEE KeyStore 中,不会暴露给应用程序?
你不能那样做,因为那个密钥库没有密码。您唯一的选择是添加 2 个密钥(它们可能需要相同的密钥 material);一个带有 setUserAuthenticationRequired(true)
,另一个带有 setUserAuthenticationRequired(false)
...否则您始终需要提供生物识别身份验证才能继续,因为此标志一旦设置就不是可选的。