2012-03-13 2 views
2

Я хочу расшифровать строку, которая работает с правильным паролем. Я пытался проверить пароль с if(decrypt(Password, encryptedKey).contains(Key)){ Но если PW не так, я получаю следующее исключение:Проверить пароль перед расшифровкой

javax.crypto.BadPaddingException: pad block corrupted 

Так есть еще один способ проверки пароля?

public static String decrypt(String seed, String encrypted) throws Exception { 
    byte[] rawKey = getRawKey(seed.getBytes()); 
    byte[] enc = toByte(encrypted); 

    SecretKeySpec Spec = new SecretKeySpec(rawKey, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, Spec); 


    byte[] result = cipher.doFinal(enc); 

    return new String(result); 
} 
+1

Ну, если он не расшифрует (и не выдаст исключение) с использованием неправильного пароля, но расшифрует с использованием правильного пароля, в чем проблема? Нет (или, по крайней мере, * не должен быть *) «более простой» способ проверить пароль, чем фактически расшифровать. – Piskvor

+0

Вы имеете в виду, что я должен использовать try и catch ?? – Droider

ответ

2

Ну, если он не расшифрует (и не выдаст исключение) с использованием неправильного пароля, но расшифрует с использованием правильного пароля, что проблема? Нет (или по крайней мере не должно быть) более простой способ проверить пароль, чем собственно дешифрование: наличие ярлыка обеспечивает слабое место, на которое может нападать злоумышленник («зачем пытаться каждый из возможных паролей, когда есть подсказка пароля под ковриком? »).

Если он расшифровывает без исключения, пароль правильный; если вы получаете это исключение, пароль неверен.

Это может быть не оптимальным стилистически (как в случае «только с использованием исключений для исключительных состояний»), но не снижает безопасность вашей системы, например, хранение пароля вместе с данными (хеширование пароля перед хранением помогает бит, но легко ошибиться, и это все еще увеличивает сложность системы при одновременном снижении ее безопасности - см., Например, this на предмет сложных сложностей).

+0

Хорошо, вы меня убедили. – Droider

+2

Это исключение не является надежным индикатором неправильного пароля. Другими словами, плохие пароли могут по-прежнему приводить к действительным блокам пэдов в случайном порядке, особенно когда сумма заполнения составляет всего 1 или 2 байта. –

+0

@GregS: Справедливая точка. OP, вероятно, должен проверить, что расшифрованный вывод имеет смысл - расшифровка IIRC с неправильным паролем (даже если он не сломает прокладку) должен выдавать мусор, не так ли? – Piskvor

2

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

+0

Хорошо, спасибо. Эта строка является одной строкой файла, поэтому я сохраню пароль в файле, зашифрованном с помощью шифрования MD5. – Droider

+0

. Я бы избежал сохранения хэша пароля нигде, потому что это ослабляет вашу систему - теперь злоумышленнику нужно сначала разбить хэш, быть потенциально проще, чем дешифрование. –

+0

@ RomanPlášil В отличие от сохранения пароля открытого текста? – Andreas

Смежные вопросы