Obscured SharedPreference, BadPaddingException: поврежден блок пэда - PullRequest
0 голосов
/ 09 мая 2018

Следующий код работал нормально, но на Samsung SM-G950F, Android OS 8.0.0 он вылетает:

private String encrypt(String value) {

  try {
    final byte[] bytes = value != null ? value.getBytes(UTF8) : new byte[0];
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID).getBytes(UTF8), 20));
    return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP), UTF8);

  } catch (Exception e) {
    return value;
  }

}

private String decrypt(String value) {
  try {
    final byte[] bytes = value != null ? Base64.decode(value, Base64.DEFAULT) : new byte[0];
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
    pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID).getBytes(UTF8), 20));
    return new String(pbeCipher.doFinal(bytes), UTF8);

  } catch (Exception e) {
    return value;
  }
}

вот полное сообщение об ошибке:

 Caused by java.lang.RuntimeException: javax.crypto.BadPaddingException: pad block corrupted
    at com.edaf.utils.ObscuredSharedPreferences.decrypt(SourceFile:185)
    at com.edaf.utils.ObscuredSharedPreferences.getString(SourceFile:134)
    at com.edaf.utils.Utils.getFromGlobals(SourceFile:145)

Я изменил возвращаемое значение при сбое, но я уверен, что это не поможет

1 Ответ

0 голосов
/ 09 мая 2018

Этот фрагмент кода был предназначен для сбоя , если шифрование было выполнено на одном устройстве, а дешифрование выполняется на другом устройстве. Если Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID) возвращает другую строку, то параметр salt в конструкторе PBEParameterSpec будет другим.

Как только соль будет другой, из пароля будет вычислен другой ключ, и ваша расшифровка будет с вероятностью , что приведет к сбою с исключением, связанным с заполнением. Соль - это , используемая для создания другого значения, даже если пароли идентичны (при использовании только идентификатор довольно глуп, поскольку использование одного и того же идентификатора приведет к одинаковым паролям, даже в разных приложения).

Если дешифрование не завершится неудачей, кстати, вы получите открытый текст для мусора.


В коде вопроса есть бесконечные проблемы, например, использование одного DES, счетчика 20 итераций и неаутентифицированного шифрования. Я мог бы опубликовать длинный обзор страницы, но вместо этого я призываю вас прочитать книгу о современной криптографии и пересмотреть свой протокол как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...