मेरे पास एंड्रॉइड कीस्टोर में एक एन्क्रिप्टेड पासवर्ड संग्रहीत है।उपयोगकर्ता नाम नहीं प्रमाणीकृत FingerprintManager.authenticate के दौरान अपवाद()
मैं फिंगरप्रिंट एपीआई का उपयोग कर उपयोगकर्ता को प्रमाणीकृत करके उस पासवर्ड को डिक्रिप्ट करना चाहता हूं।
जहां तक मैं समझता हूं, मुझे FingerprintManager.authenticate(CryptoObject cryptoObject)
विधि को फिंगरप्रिंट परिणाम सुनने के लिए कॉल करना होगा। CryptoObject पैरामीटर ऐसा बनाया जाता है:
public static Cipher getDecryptionCipher(Context context) throws KeyStoreException {
try {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
SecretKey secretKey = getKeyFromKeyStore();
final IvParameterSpec ivParameterSpec = getIvParameterSpec(context);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
return cipher;
} catch (NoSuchAlgorithmException | NoSuchPaddingException | IOException | UnrecoverableKeyException | CertificateException | InvalidAlgorithmParameterException | InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
Cipher cipher = FingerprintCryptoHelper.getDecryptionCipher(getContext());
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
fingerprintManager.authenticate(cryptoObject, ...);
विधि getDecryptionCipher()
cipher.init()
कॉल जब तक सही ढंग से काम करता है। इस कॉल पर मुझे UserNotAuthenticatedException
मिलता है, क्योंकि उपयोगकर्ता इस गुप्तकी के लिए प्रमाणित नहीं है। जो किसी भी तरह से समझ में आता है। लेकिन यह एक पाश, असंभव को पूरा करने के लिए है:
- उपयोगकर्ता को प्रमाणित करने के लिए, मैं उसकी/उसके फिंगरप्रिंट का उपयोग करने के
- उसकी/उसके फिंगरप्रिंट के लिए सुनने के लिए चाहते हैं, तो मैं init करने की जरूरत है सिफर, जो बदले में एक प्रमाणीकृत उपयोगकर्ता की आवश्यकता है
क्या गलत है ??
संपादित करें:
मैं एमुलेटर (Nexus 4, एपीआई 23) के साथ काम करते हैं।
यहां कोड है जिसका उपयोग मैं कुंजी बनाने के लिए करता हूं।
private SecretKey createKey() {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
keyGenerator.init(new KeyGenParameterSpec.Builder(
KEY_NAME,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(AUTHENTICATION_DURATION_SECONDS)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
return keyGenerator.generateKey();
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
throw new RuntimeException("Failed to create a symmetric key", e);
}
}
कौन-सा उपकरण आप इस पर परीक्षण कर रहे हैं? आपने कुंजी कैसे उत्पन्न की? – Michael
और आपने एमुलेटर में कम से कम एक फिंगरप्रिंट नामांकित किया है? – Michael
@ माइकल यह कुछ सैमसंग और एक एचटीसी वन मिनी पर नेक्सस उपकरणों से लेकर विभिन्न उपकरणों पर परीक्षण किया गया है। और हाँ, मैंने इसे एम्यूलेटर पर भी परीक्षण किया। – muetzenflo