2017-02-13 3 views
2

У меня есть следующая проблема:java read encrypted Объекты

У меня есть доступ к классу/объекту, который является Serializable.

public class Access implements Serializable { 

private static final long serialVersionUID = 1L; 

private URL website; 
private String username; 
private String password; 

// + some methods 

} 

Теперь, записывая их в файл, я шифрую их с помощью шифрования. Похоже, это:
ЗАПИСЬ:

ObservableList<Access> userData; 
userData = FXCollections.observableArrayList(); 
... 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, key128); 
File file = new File("./resources/saves" + username); 
file.createNewFile(); 
CipherOutputStream cipherOut = new CipherOutputStream(
     new BufferedOutputStream(new FileOutputStream(file, true)), cipher); 
ObjectOutputStream out = new ObjectOutputStream(cipherOut); 

userData.forEach((item) -> { 
    try { 
     out.writeObject(new SealedObject(item, cipher)); 
    } catch (IllegalBlockSizeException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}); 
out.flush(); 
out.close(); 

ЧТЕНИЕ:

ObservableList<Access> access = FXCollections.observableArrayList(); 

Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.DECRYPT_MODE, key128); 

CipherInputStream cipherIn = new CipherInputStream(
     new BufferedInputStream(new FileInputStream("./resources/saves" + username)), cipher); 
ObjectInputStream in = new ObjectInputStream(cipherIn); 
SealedObject sealed; 
while ((sealed = (SealedObject) in.readObject()) != null) { 
    access.add((Access) sealed.getObject(cipher)); 
} 

Если я теперь загрузить файл кажется поврежден. Мне трудно найти ошибку. Я думаю, что проблема находится в функции нагрузки. Мне что-то здесь не хватает?

Ошибка:

java.io.StreamCorruptedException: invalid stream header: 3D23898C 

Спасибо за ваше время & помощь! : *

+0

Что произойдет, если вы закомментируете (де) шифрование из ваших методов? Можете ли вы написать и прочитать незашифрованный объект? – 9000

+0

Я просто попробовал, и теперь я получаю исключение EOF во время чтения. Я, наверное, перепутаю петлю? ** РЕДАКТИРОВАТЬ ** Да, некоторые проблемы с циклом. Он отлично работает без шифрования. –

+0

@ Emmanuel: Не я бы попробовал наоборот: писал и читал строку через потоки шифра, чтобы убедиться, что эта часть работает нормально. – 9000

ответ

2

Хорошо, проблема заключается в взаимодействии между потоком шифрования и потоком объектов.

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

Хорошая новость: вам это действительно не нужно! SealedObject позаботится о шифровании/расшифровке для вас. Просто удалите поток шифрования, и он должен работать.

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file, true)); 

и читать:

FileInputStream inputStream = new FileInputStream(fileName); 
    ObjectInputStream ois = new ObjectInputStream(inputStream); 

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

+0

Merci! Большое спасибо.Это решило проблему! –

+0

De rien! взломать! –

1

Вы забыли позвонить по телефону out.flush()иout.close()?

Если вы это сделали, некоторые данные могут быть фактически не записаны на диск, и их будет невозможно прочитать снова.

+0

Я действительно называл «close()», но не смывал его. К сожалению, это не решает проблему. :(Я собираюсь отредактировать/обновить сообщение –

+0

Хорошо, это было слепое предположение :) Я собираюсь попробовать ваш код. –