jeroentrappers / flutter_keychain

A flutter plugin for secure storage on Android via KeyStore and iOS via Keychain
Other
56 stars 41 forks source link

Android error: OPENSSL_internal:BAD_DECRYPT #37

Closed jopmiddelkamp closed 10 months ago

jopmiddelkamp commented 1 year ago

Get this error for some of my Android users.

Fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: PlatformException(flutter_keychain, error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT, javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT
    at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
    at com.android.org.conscrypt.OpenSSLEvpCipher.doFinalInternal(OpenSSLEvpCipher.java:152)
    at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:374)
    at javax.crypto.Cipher.doFinal(Cipher.java:2056)
    at d0.a.b(Unknown Source:40)
    at d0.b.onMethodCall(Unknown Source:181)
    at v4.k$a.a(Unknown Source:17)
    at i4.c.l(Unknown Source:18)
    at i4.c.m(Unknown Source:40)
    at i4.c.i(Unknown Source:0)
    at i4.b.run(Unknown Source:12)
    at android.os.Handler.handleCallback(Handler.java:978)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loopOnce(Looper.java:238)
    at android.os.Looper.loop(Looper.java:355)
    at android.app.ActivityThread.main(ActivityThread.java:8080)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026)
, null). Error thrown PlatformException.
       at StandardMethodCodec.decodeEnvelope(message_codecs.dart:653)
       at MethodChannel._invokeMethod(platform_channel.dart:315)
       at FlutterKeychain.get(flutter_keychain.dart:15)
       at ._getHydratedStorageEncryptionKey(bootstrap.dart:421)
       at ._getHydratedStorage(bootstrap.dart:409)
       at .bootstrap(bootstrap.dart:40)
       at .mainDelegate(main_delegate.dart:72)

This is the code

Future<Storage> _getHydratedStorage() async {
  var encryptionKey = await _getHydratedStorageEncryptionKey();
  final storage = await HydratedStorage.build(
    storageDirectory: await getTemporaryDirectory(),
    encryptionCipher: HydratedAesCipher(
      sha256.convert(utf8.encode(encryptionKey)).bytes,
    ),
  );
  return storage;
}

Future<String> _getHydratedStorageEncryptionKey() async {
  const storageKey = '...';
  var encryptionKey = await FlutterKeychain.get(
    key: storageKey,
  );
  if (encryptionKey == null) {
    encryptionKey = base64.encode(Hive.generateSecureKey());
    await FlutterKeychain.put(
      key: storageKey,
      value: encryptionKey,
    );
  }
  return encryptionKey;
}

And this is the version of the package.

environment:
  sdk: '>=2.19.0 <3.0.0'

dependencies:
  flutter:
    sdk: flutter
  flutter_keychain: ^2.2.1
jopmiddelkamp commented 1 year ago

Got him to reset the storage of the app and now it works. Might somehow got corrupted.

jeroentrappers commented 10 months ago

Thanks