2017-02-04 10 views
1

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

Cipher cipher = Cipher.getInstance("DESede"); 
byte[] bytes = cipher.doFinal(value.getBytes()); 
String encrypted = new String(bytes); 

Эта строка затем хранится в базе данных под колонкой (ами) VARCHAR

Для расшифровки:

Cipher cipher = Cipher.getInstance("DESede"); 
byte[] bytes = cipher.doFinal(value.getBytes()); 
String decrypted = new String(bytes);[code] 

Теперь, казалось бы, случайно я получаю случайные

javax.crypto.BadPaddingException: Given final block not properly padded 
+1

Пара вещей ... Во-первых, похоже, что вы шифруете пароли, что является очень плохой идеей. Во-вторых, ваш код небезопасен из-за использования режима ECB. Используйте GCM или CBC с HMAC. Кроме того, вы определяете шифр для использования PKCS5Padding, а затем пытаетесь вручную поместить результат с символом 0 ...? Зачем? Это не нужно. –

+0

Также не используйте DES/3DES, используйте AES для новой работы. – zaph

ответ

3

Данные, полученные из шифрования, - двоичный код. Вы не можете безопасно преобразовать byte[] в String и обратно, как и вы, поскольку не все байты имеют отображение 1-1 взад и вперед. Либо сохраните данные в поле, которое может обрабатывать двоичные данные , либо кодировать данные с помощью кодировок, которые не теряют данные, такие как base64 или Hex кодировка.

1
String encrypted = new String(bytes); 

Проблема здесь. String не является контейнером для двоичных данных. Используйте byte[], или hex или base64-encode, если у вас должен быть String.