gpt4 book ai didi

带签名的 Android 指纹认证

转载 作者:行者123 更新时间:2023-11-29 19:11:45 25 4
gpt4 key购买 nike

我正在尝试使用 Signature使用指纹身份验证对数据进行签名和验证的对象。它在签名时工作正常,但在验证时出现此错误:

java.lang.IllegalArgumentException: Crypto primitive not backed byAndroidKeyStore provider: Signature object:SHA256withECDSA, spi:com.android.org.conscrypt.OpenSSLSignature$SHA256ECDSA@cf4a416

异常不是在生成 key 时抛出(这部分没问题),而是在调用 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_VERIFYKeyGenParameterSpec.Builder 但它也不起作用,无论如何这就是他们在官方 Google 存储库中的做法: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 Keystore key 的公钥初始化 Signature 实例。您的问题类似于 Initializing FingerpringManager.Crypto Object, getting Crypto primitive not backed by AndroidKeyStore provider?

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

因此可以直接使用

   signature.verify(sigToVerify)` 

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

  signature.initVerify(signatureKey.getPublic())

关于带签名的 Android 指纹认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45051996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com