触摸三星手机上的指纹后出错:android.security.KeyStoreException:未经过身份验证的密钥用户

pet*_*syn 13 encryption android fingerprint android-keystore android-6.0-marshmallow

我的应用程序使用Android 6.0指纹API来保护Android KeyStore中的AES密钥.只有当用户通过指纹传感器进行身份验证时,才能使用存储的密钥,因为KeyGenParameterSpec已初始化setUserAuthenticationRequired(true).

当用户触摸传感器时,我从回调中获得初始化的密码,并将onAuthenticationSucceeded(Cipher)其用于解密.

除了搭载Android 6的三星手机外,这种方法效果很好.当我尝试使用返回的密码时,三星手机有时会抛出android.security.KeyStoreException: Key user not authenticated.因此,即使onAuthenticationSucceeded(Cipher)Android KeyStore 返回密码认为用户未被指纹传感器验证.

当应用程序长时间不使用时,似乎发生了崩溃.当应用程序崩溃时,通常都能正常工作.

因为这个错误是随机发生的,而且只发生在三星手机上...这似乎是由Android 6.0 KeyStore和FingerPrint API的三星实现中的一些内部计时问题引起的.

编辑:此问题也在OnePlus和Acer手机中体验过.

Nul*_*ter 16

设置KeyGenParameterSpec.setUserAuthenticationRequired(false)可能是一个潜在的安全问题.应该类似于KeyPermanentlyInvalidatedException处理上述错误.如果在创建SecretKey后添加新指纹,则会在Cipher初始化时引发KeyPermanentlyInvalidatedException .但是,如果在添加新指纹之前初始化Cipher,当您尝试使用该Cipher 加密或解密时,您将获得未经过身份验证的Key User的上述KeyStoreException .

重现此错误很容易.当应用程序的指纹验证屏幕在后台时,请尝试添加新指纹.现在切换回应用程序,并输入指纹,加密或解密方法会抛出此错误.我可以通过捕获异常并以与KeyPermanentlyInvalidatedException相同的方式处理它来解决此问题.

  • 不幸的是,这个bug与添加新指纹无关.它是随机发生的. (15认同)

Chr*_*ick 6

不要听"setUserAuthenticationRequired(false)"

我已经能够通过两次聆听在三星上重现这一点.我认为发生的事情是,你听两次,在一次通话中进行身份验证,但通过另一次通话进行验证.

添加日志并检查您是否只开始只扫描一次指纹.

  • 它绝对是听多次之间的竞争条件.是的,它只发生在某些三星手机上. (2认同)

pet*_*syn 2

由于我预计上述制造商不会很快解决此问题,因此我通过KeyGenParameterSpec.setUserAuthenticationRequired(false)为三星、OnePlus、华硕和其他一些设备设置来解决此问题。

  • 这个答案意味着应该设置用户身份验证要求,因为它是或不是三星手机。这在很多层面上都是糟糕的。`setUserAuthenticationRequired` 是一个针对您的安全计划的问题,而不是针对修复错误。 (24认同)
  • 有趣的故事,事实证明这是 Samsung 6.0.1 设备的问题,而我们最终只是执行了“setUserAuthenticationRequired(false)”。我们甚至由外部安全公司对此进行了审核,除非手机已root,否则不存在实际的安全问题。 (5认同)