private void decryptCredentials(DatabaseEntry entry, JSONObject jDatabase) { String databaseUsername, databasePassword = null; // if no encryption key or both username and password are empty, skip encryption if (!SettingsManager.getSyncSetting(SettingsManager.SyncKey.sync_credentials) || TextUtils.isEmpty(SettingsManager.getEc()) || (TextUtils.isEmpty(databaseUsername = jDatabase.optString("database_username")) && TextUtils.isEmpty(databasePassword = jDatabase.optString("database_password")))) return; try { AesCbcWithIntegrity.SecretKeys keys = AesCbcWithIntegrity.keys(SettingsManager.getEc()); if (!TextUtils.isEmpty(databaseUsername)) { AesCbcWithIntegrity.CipherTextIvMac cipherTextIvMac = new AesCbcWithIntegrity.CipherTextIvMac(databaseUsername); entry.databaseUsername = AesCbcWithIntegrity.decryptString(cipherTextIvMac, keys); } if (!TextUtils.isEmpty(databasePassword)) { AesCbcWithIntegrity.CipherTextIvMac cipherTextIvMac = new AesCbcWithIntegrity.CipherTextIvMac(databasePassword); entry.databasePassword = AesCbcWithIntegrity.decryptString(cipherTextIvMac, keys); } } catch (GeneralSecurityException | UnsupportedEncodingException e) { if (SettingsManager.DEBUG()) e.printStackTrace(); // fail silently on any kind of error // user will see warning on database entry when restored without username/password } }