为什么Android指纹认证需要加密对象?

23

我已经研究了谷歌提供的Android指纹示例。

https://github.com/googlesamples/android-FingerprintDialog

由于我对安全标准不太了解,因此我无法理解以下内容:

  1. 为什么我们需要使用Keystore、key、CryptoObject等?简单来说,我们可以要求指纹管理器对用户进行身份验证,并且它只需返回状态(成功/失败)即可。
  2. 每次身份验证时是否需要生成新密钥?

3
可以简单地理解为,通过调用指纹管理器的“authenticate()”方法来验证用户指纹,并返回验证结果(成功/失败)。在此过程中,“CryptoObject”参数可以为空。具体请参考Android开发文档中“FingerprintManager”类的“authenticate()”方法 - CommonsWare
谢谢,我计划在我的应用中使用指纹验证,但是是否仍建议使用密钥、密钥库等?您能为我指引理解这个概念的方向吗? - Ponsuyambu
1
我建议您提出一个单独的Stack Overflow问题,详细解释您想要的指纹认证以及您试图通过它保护什么(API密钥?用户数据?其他内容?),并在那里询问哪些指纹API方面最适合您的需求。 - CommonsWare
3个回答

15
为什么我们需要使用Keystore,key,CryptoObject等?简单来说,可以向指纹管理器请求用户身份验证,然后它可以简单地返回状态(成功/失败)。
您不必使用CryptoObject进行指纹认证,只需传递null值即可。这样就不必处理密钥库和其他东西。
在指纹认证上下文中,CryptoObject的唯一用途是知道自上次用户通过指纹进行身份验证以来是否添加了新指纹。
如果添加了新指纹,则必须提示密码以验证用户的身份,然后生成新密钥(因为新指纹添加后它们变得无效)。
同样,如果传递null CryptoObject,则不必处理这些内容。
观点问题
指纹认证不需要CryptoObject,事实上恰恰相反。
当您在Android上进行加密操作时,可以使用以下对象之一:CipherSignatureMac(以及其他对象)。这三个对象中的一个可以用于构建CryptoObject
当您为这些对象生成密钥时,有一个名为setUserAuthenticationRequired(boolean)的方法,该方法管理获取仅在用户之前通过指纹进行身份验证的密钥有效。
因此,在客户端/服务器通信的情况下,如果客户端可以使用密钥,则意味着他已通过指纹进行身份验证,并且已知他的身份。
话虽如此,您可能想要检查我的库,它可以使整个过程变得更加容易:

https://github.com/OmarAflak/Fingerprint


4
在指纹身份验证的情况下,CryptoObject 的唯一用途是知道自上次用户通过指纹进行身份验证以来是否添加了新指纹。这肯定不是唯一的用途。仅仅监听 onAuthenticationSucceeded 并将其作为是否允许用户执行某些操作的条件(true/false)并不提供特别强的安全性。 - Michael
1
如果您使用指纹保护的密钥执行加密操作,例如创建数字签名或解密某些敏感数据,那么这将更难被绕过。 - Michael
2
因为这个错误的陈述被踩了:在指纹认证环境中,CryptoObject 的唯一用途是知道自上次用户通过指纹进行身份验证以来是否添加了新的指纹。 - Chad Bingham

8
为什么我们需要使用Keystore、key、CryptoObject等?简单来说,可以请求指纹管理器对用户进行认证,然后它只需返回状态(成功/失败)。
当我第一次了解Android指纹识别时,我也是这么想的。经过我的研究,我认为我可以用简单的语言总结一下CryptoObject,因为技术描述无法帮助理解概念:
CryptoObject由您的Android Keystore中的一个密钥创建,该密钥本质上被视为“安全”[1]。因此,将CryptoObject传递给指纹管理器让管理员有一个锚点,确保指纹验证结果没有被篡改,这在理论上是可能的[2]。
可以这样想,如果您传入null,则指纹管理器盲目地信任来自指纹匹配结果的结果。如果您传入一个由密钥创建的CryptoObject,只有您的应用程序才能访问该密钥,因此返回的结果很可能会具有此CryptoObject,只有您的应用程序才能成功识别。这里有另一个更常见的引述。
“ CryptoObject使过程更加安全,因为如果该对象不受KeyStore支持,则它将始终失败。”[3]
[4]链接中的图片也给您提供了一个想法。
[1]https://developer.android.com/training/articles/keystore [2]https://learn.microsoft.com/en-us/xamarin/android/platform/fingerprint-authentication/creating-a-cryptoobject [3]https://medium.com/@manuelvicnt/android-fingerprint-authentication-f8c7c76c50f8 [4]https://infinum.co/the-capsized-eight/android-fingerprint-security

这应该是被接受的答案。您需要使用CryptoObject来使生物识别身份验证更加安全。 - Alan

1

你的一个问题的答案:

我们将创建一个带有别名的密钥,并使用别名检索密钥。别名是密钥的键。应用沙盒中存储别名列表。在尝试使用相同别名生成密钥的后续尝试中,它将检索密钥。


你能再解释一下吗?第三方有可能会拦截指纹扫描器返回的结果。使用加密对象来加密指纹扫描器返回的结果。 - Yash
2
你关于第三方的说法是完全错误的。无论如何,没有数据会被拦截。从Android文档中可以看到:因此,原始图像和处理后的指纹特征不得在不受信任的内存中传递。所有这些生物识别数据都需要在传感器硬件或可信内存中进行安全保护。(TEE内部的内存被视为可信内存;TEE外部的内存被视为不受信任的内存。) - Omar Aflak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接