Problem bei Verwendung von Android-fingerprint: IV erforderlich, wenn die Entschlüsselung. Verwenden IvParameterSpec oder AlgorithmParameters zu geben
Habe ich nach dem ConfirmCredential Beispiel Android von Google, aber es zeigt nur, wie die Daten zu verschlüsseln. Wenn ich versuche es zu entschlüsseln, bekomme ich exception:
java.security.InvalidKeyException: IV required when decrypting. Use IvParameterSpec or AlgorithmParameters to provide it.
Ich verwende den folgenden code:
String transforation = KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7;
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
SecretKey secretKey = (SecretKey) keyStore.getKey(KEY_NAME, null);
//encrypt
Cipher cipher = Cipher.getInstance(transforation);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String encriptedPassword = cipher.doFinal("Some Password".getBytes("UTF-8"));
//decrypt
cipher = Cipher.getInstance(transforation);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
String password = new String(cipher.doFinal(encriptedPassword), "UTF-8"));
Ausnahme wird ausgelöst bei Zeile:
cipher.init(Cipher.DECRYPT_MODE, secretKey);
Jede Idee, was ist der richtige Weg, um die Entschlüsselung in diesem Fall?
- Look at stackoverflow.com/questions/6669181/... und sehen, ob mit der Verwendung einer IvParameterSpec hilft.
- Klar, doppelte IMHO.
- Ich hatte bereits versucht, indem IV, aber es ging mit der exception: java.Sicherheit.InvalidAlgorithmParameterException: Anrufer-vorausgesetzt IV nicht zulässig, wenn die Verschlüsselung.
- duplizieren Sie die Frage?
- Die eine @ditkin verbunden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich müssen Sie passieren die IvParameterSpec für das entschlüsseln Modus in der Erwägung, dass Sie sollte nicht manuell einstellen es für die Verschlüsselung-Modus.
So, hier ist, was ich Tat und es funktionierte gut:
Können Sie auch codieren, die IV-Daten mit Base64 und speichern Sie es unter gemeinsame Einstellungen, anstatt es zu speichern unter eine Datei.
In jedem Fall, Wenn Sie haben beschäftigt die neuen voll-backup-Funktion für Android M, im Hinterkopf behalten, dass diese Daten sollten NICHT werden dürfen, backup/restore, da es ungültig ist, wenn ein Benutzer die app neu installieren oder installieren Sie die app auf einem anderen Gerät.
generateKey()
?Erstellte ich ein Problem in der github-Projekt für die Probe zur Verfügung gestellt von google (link zum Thema hier). Die Antwort, die ich habe ist, dass ich verwenden muss, die IV, die generiert wurde, wenn der Wert verschlüsselt wurde. (identisch mit der Lösung von @Qianqian)
Erstellte ich eine Beispielanwendung, die zeigt, wie dies zu tun. Es ist verfügbar auf github, hier.
Hoffe, dies ist nützlich, um jemanden.
Wie wäre es damit,
mCipher.init(Cipher.DECRYPT_MODE, key, mCipher.getParameters());
Wenn Sie den Beispielcode verwenden von Google-repo, obige Zeile funktioniert, beachten Sie auch, für jeden mChiper.init, die wir brauchen, um die Authentifizierung mit Fingerabdruck einmal, das bedeutet, dass zwei Fingerabdruck-auth wird benötigt, eines für Verschlüsselung und eines für die Entschlüsselung.
https://github.com/googlesamples/android-FingerprintDialog