【问题标题】:Android Fingerprint Authentication with Signature带有签名的安卓指纹认证
【发布时间】:2017-07-12 08:11:17
【问题描述】:

我正在尝试使用Signature 对象通过指纹身份验证来签名和验证数据。它适用于签名,但在验证时我收到此错误:

java.lang.IllegalArgumentException:加密原语不受支持 AndroidKeyStore 提供者:签名对象: SHA256 与 ECDSA,spi: com.android.org.conscrypt.OpenSSLSignature$SHA256ECDSA@cf4a416

不是在生成密钥时抛出异常(这部分很好),而是在调用fingerprintManager.authenticate(cryptoObject, ...)时抛出异常

基本上这就是我生成CryptoObject 实例的方式:

KeyPairGenerator signatureKeyGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
signatureKeyGenerator.initialize(new KeyGenParameterSpec.Builder(keyName, KeyProperties.PURPOSE_SIGN)
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
        .setUserAuthenticationRequired(true)
        .build());

KeyPair signatureKey = signatureKeyGenerator.generateKeyPair();

Signature signature = Signature.getInstance("SHA256withECDSA");

switch (MODE) {
    case KeyProperties.PURPOSE_SIGN:
        signature.initSign(signatureKey.getPrivate());
        break;
    case KeyProperties.PURPOSE_VERIFY:
        KeyFactory factory = KeyFactory.getInstance(signatureKey.getPublic().getAlgorithm());
        X509EncodedKeySpec spec = new X509EncodedKeySpec(signatureKey.getPublic().getEncoded());
        PublicKey unrestrictedPublicKey = factory.generatePublic(spec);
        signature.initVerify(unrestrictedPublicKey);
        break;
}

CryptoObject cryptoObject new CryptoObject(signature);

我尝试将| KeyProperties.PURPOSE_VERIFY 添加到KeyGenParameterSpec.Builder,但它也不起作用,无论如何,这就是他们在官方谷歌回购中的做法:https://github.com/googlesamples/android-AsymmetricFingerprintDialog(奇怪......)

最后我尝试查看 Android 源代码以了解引发异常的原因:AndroidKeyStoreProvider.java

Object spi = ((Signature) cryptoPrimitive).getCurrentSpi();
if (spi == null) {
    throw new IllegalStateException("Crypto primitive not initialized");
} else if (!(spi instanceof KeyStoreCryptoOperation)) {
    throw new IllegalArgumentException(
            "Crypto primitive not backed by AndroidKeyStore provider: " + cryptoPrimitive
            + ", spi: " + spi);
}

但我什至找不到getCurrentSpi() 方法...

任何帮助将不胜感激!

【问题讨论】:

    标签: android authentication keystore signature fingerprint


    【解决方案1】:

    在验证模式下,您正在使用不是 Android Keystore 密钥的公钥初始化 Signature 实例。您的问题类似于Initializing FingerpringManager.Crypto Object, getting Crypto primitive not backed by AndroidKeyStore provider?

    验证数字签名不是限制性操作,因为使用 public 密钥执行,因此您真的不需要 FingerprintManager 和 CryptoObject

    所以可以直接使用

       signature.verify(sigToVerify)` 
    

    或使用 Android Keystore 公钥初始化 Signature 对象

      signature.initVerify(signatureKey.getPublic())
    

    【讨论】:

    • 我明白了!第一次看其他帖子的时候没看懂!
    • 我将跳过身份验证进行验证。但无论如何使用signature.initVerify(signatureKey.getPublic()) 是行不通的。我收到相同的错误消息。
    • 好的,在这种情况下,公钥确实是支持到 Android Keystore 中的那个,所以我猜想在受保护区域中无法执行使用公钥进行验证的实现。正如我上面所说,它没有意义
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 2016-10-17
    • 2018-12-31
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多