我已经浏览了谷歌提供的安卓指纹样本。
https://github.com/googlesamples/android-FingerprintDialog
由于我是安全标准的新手,因此我无法理解以下内容。
- 为什么我们需要使用 Keystore、key、CryptoObject... 等?简单来说就是,要求指纹管理器对用户进行身份验证,它可以简单地返回状态(成功/失败)
- 每次认证时我都需要生成新密钥吗?
我已经浏览了谷歌提供的安卓指纹样本。
https://github.com/googlesamples/android-FingerprintDialog
由于我是安全标准的新手,因此我无法理解以下内容。
为什么我们需要使用 Keystore、key、CryptoObject... 等?简单来说就是,要求指纹管理器对用户进行身份验证,它可以简单地返回状态(成功/失败)
你不必。您可以在没有 的情况下进行指纹认证CryptoObject
,只需传递一个null
值。然后就不必弄乱密钥库和其他东西了。
在指纹身份验证上下文中唯一的用途CryptoObject
是了解自上次用户通过指纹进行身份验证以来是否添加了新指纹。
每次认证时我都需要生成新密钥吗?
如果添加了新指纹,则必须提示输入密码以验证用户身份,然后生成新密钥(因为添加新指纹时它们变得无效)。
如果你通过了,你就不必再弄乱这些null
CryptoObject
指纹认证不需要 CryptoObject,事实上恰恰相反。
在 Android 上进行加密操作时,可以使用以下对象之一:Cipher、Signature、Mac(和其他)。这三个之一可用于构建CryptoObject。
当您为这些对象生成密钥时,有一个名为的方法,该方法仅在用户之前通过指纹进行身份验证时才setUserAuthenticationRequired(boolean)
设法使密钥有效。
因此,例如在客户端/服务器通信的情况下,如果客户端可以使用密钥,则意味着他通过指纹进行了身份验证,并且他的身份是已知的。
也就是说,您可能想查看我的库,这会使整个事情变得容易得多:
为什么我们需要使用 Keystore、key、CryptoObject... 等?简单地说,它可能 > 就像,要求指纹管理器对用户进行身份验证,它可以 > 简单地返回状态(成功/失败)
当我第一次阅读有关 android 指纹的信息时,我也有同样的想法。通过我的研究,我想我可以用简单的英语为您总结 CryptoObject,这正是您正在寻找的,因为技术描述无助于理解概念:
CryptoObject 是由您的 android 密钥库中的密钥创建的,该密钥本质上被认为是“安全的”[1]。因此,将 CryptoObject 传递给指纹管理器可以让管理器有一个锚点来确认指纹认证结果没有被篡改,这在理论上是可能的 [2]。
这样想,如果传入 null,指纹管理器会盲目信任指纹匹配结果的结果。如果您传入一个加密对象,该对象是由一个只有您的应用程序可以访问的密钥创建的,因为密钥库,那么返回的结果可能会包含这个只有您的应用程序才能成功识别的加密对象。这是另一个更符合常识的引用。
“CryptoObject 使过程更加安全,因为如果该对象没有 KeyStore 的支持,它总是会失败。” [3]
[4] 链接中的图片也给了你一个想法。
[1] https://developer.android.com/training/articles/keystore
[3] https://medium.com/@manuelvicnt/android-fingerprint-authentication-f8c7c76c50f8
[4] https://infinum.co/the-capsized-eight/android-fingerprint-security
您的一个问题的答案,
我们将使用别名创建一个密钥并使用别名来检索密钥。别名是密钥的密钥。将为应用程序沙箱存储别名列表。它会在随后尝试生成具有相同别名的密钥时检索密钥。