使用setUserAuthentication(true)错误的Android 6.0指纹身份验证

使用setUserAuthentication(true)错误的Android 6.0指纹身份验证,android,android-6.0-marshmallow,fingerprint,Android,Android 6.0 Marshmallow,Fingerprint,我有一个指纹认证的实现,在我在HTC M9+(Android 6.0)上运行之前一直运行良好 我在AndroidKeyStore中生成了一个密钥: mKeyPairGenerator.initialize( new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)

我有一个指纹认证的实现,在我在HTC M9+(Android 6.0)上运行之前一直运行良好

我在AndroidKeyStore中生成了一个密钥:

        mKeyPairGenerator.initialize(
                new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
                        .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                        .setUserAuthenticationRequired(true)
                        .build());
        mKeyPairGenerator.generateKeyPair();
然后我尝试使用它初始化指纹验证调用的密码,在运行6.0 Android的HTC上,我得到一个错误:

Crypto primitive not backed by AndroidKeyStore provider
现在我了解到API 23中有一个bug,它不允许在没有身份验证的情况下使用公钥(即使它应该),所以我实现了从AndroidKeyStore项中提取密钥的代码,然后初始化它(根据Android文档中的建议)。那很好用

但我无法将提取的公钥密码/加密对象用于指纹身份验证调用:

m_fingerprintManager.authenticate(m_cryptoObject, m_cancellationSignal, 0, this, null)
如果我没有提取init的公钥并直接从AndroidKeyStore使用它,我会得到一个错误,说明用户没有经过身份验证

以下是用于提取公钥的initCipher代码:

            PublicKey key = mKeyStore.getCertificate(KEY_ALIAS).getPublicKey();

            PublicKey unrestricted = KeyFactory.getInstance(key.getAlgorithm())
                    .generatePublic(new X509EncodedKeySpec(key.getEncoded()));

            OAEPParameterSpec spec = new OAEPParameterSpec(
                    "SHA-256", "MGF1", MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT);

            mCipher.init(opmode, unrestricted, spec);
下面是直接从密钥库获取的代码:

PrivateKey key = (PrivateKey) mKeyStore.getKey(KEY_ALIAS, null);
            mCipher.init(opmode, key);
使用提取的public返回错误,即AndroidKeyStore不支持它

直接从存储区使用密钥会返回一个错误,即用户未经过身份验证


那么,我怎样才能让它工作呢?如前所述,直接使用密钥库中的密钥在其他设备(三星S7 Edge搭载安卓M和N、Nexus 6P搭载N、三星S6搭载M(6.0.1)和其他设备)上运行良好。

在您麻烦地获取公钥后,您可以在无需身份验证的情况下使用它(解决该漏洞),那么,为什么要将它与指纹管理器一起使用呢?指纹管理器是关于身份验证的?(顺便说一句,很高兴看到人们使用OAEP和优秀的摘要。)根据我所读的内容,我需要将用户身份验证设置为true,以便在添加指纹或更改屏幕锁等时,我将得到一个无效异常。这适用于除HTC M9之外的所有经过测试的手机。在HTC M9手机上,我得到一个异常,即当我尝试初始化密码时,用户没有经过身份验证。当我假设指纹管理器进行身份验证时,如何使用密码?这就像是先有鸡后有蛋。我需要初始化它才能在指纹身份验证中使用它,但我必须在HTC M9上进行身份验证才能初始化它。在您费尽心思获取公钥以便可以在没有身份验证的情况下使用它(以解决该漏洞)之后,为什么还要在指纹管理器中使用它,而指纹管理器就是关于身份验证的?(顺便说一句,很高兴看到人们使用OAEP和优秀的摘要。)根据我所读的内容,我需要将用户身份验证设置为true,以便在添加指纹或更改屏幕锁等时,我将得到一个无效异常。这适用于除HTC M9之外的所有经过测试的手机。在HTC M9手机上,我得到一个异常,即当我尝试初始化密码时,用户没有经过身份验证。当我假设指纹管理器进行身份验证时,如何使用密码?这就像是先有鸡后有蛋。我需要初始化它才能在指纹验证中使用它,但我必须在HTC M9上进行身份验证才能初始化它。