【发布时间】:2017-07-10 14:30:27
【问题描述】:
我在 7.1.1 的 Google Pixel 设备上进行测试,发现从设备上移除所有指纹后我的私钥并未失效。我已经按照演示应用程序使用单个对称 SecretKey 进行了测试,并且按预期工作,但是使用非对称密钥对只会在注册新打印时抛出 KeyPermanentlyInvalidatedException,而不是在它们全部删除时。
更重要的是,如果我随后注册了一个新指纹,然后显示我的指纹对话框并成功扫描我的指纹以验证 Cipher 对象,然后当我在 Cipher 对象上调用 doFinal() 时,它会抛出一个 KeyStoreException: Key user not authenticated .如果我在 KeyStoreException 之后再次尝试初始化 Cipher 对象,那么我会根据需要得到无效的异常。
我在三星 S7 上使用 6.0.1 进行了测试,并且工作正常,当打印件全部移除时,KeyPermanentlyInvalidatedException 被抛出。我在related post 中发现其他人在使用 Nexus 时遇到了问题(未提及操作系统版本),可能相关吗?设备/操作系统的某些组合不会使特定键失效,是否存在错误?
看来:
- 在 Pixel 或 7.1.1 设备上,移除所有指纹后,PrivateKey 不会失效。
- 如果在之前删除所有打印后注册新打印,则 PrivateKey 不能用于解密数据,但只有在您尝试使用后才会失效。
当我检测到用户之前在我的应用程序中注册了指纹但现在设备上没有注册指纹作为故障保护时,有没有办法通过密钥库或其他方式手动使密钥无效?
更新:根据请求显示密钥生成。
mKeyPairGenerator.initialize(
new KeyGenParameterSpec.Builder(getKeyName(), KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.setUserAuthenticationRequired(true)
.setRandomizedEncryptionRequired(true)
.build());
mKeyPairGenerator.generateKeyPair();
【问题讨论】:
-
你用过
setUserAuthenticationRequired和setUserAuthenticationValidityDurationSeconds吗?显示您的代码。 -
是的,我使用的是
setUserAuthenticationRequired(true),但没有使用有效期,因为我想授权每次使用密钥。 -
嗨,我也有同样的问题。你能解决吗?谢谢;)
-
嘿@Venator85,很遗憾没有。就像我在帖子中提到的那样,我认为这是 Android 的错误以及特定的键组合。
-
即使在 Android 8.0 中运行的 Pixel 也会给我同样的问题。那里有工作吗?
标签: android encryption cryptography fingerprint