2017-02-13 5 views
2

안녕하세요 저는 다음과 같습니다.java 읽기 암호화 됨 객체

클래스/객체 액세스가 Serializable입니다.

public class Access implements Serializable { 

private static final long serialVersionUID = 1L; 

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

// + some methods 

} 

이제 File에 쓰기를 할 때 Cipher를 사용하여 암호화합니다. 다음과 같습니다
WRITING :

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(); 

READING :

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

메소드에서 (de) 암호문을 주석 처리하면 어떻게됩니까? 암호화되지 않은 객체를 작성하고 다시 읽을 수 있습니까? – 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

좋아, 그건 장님 맞춰 :) 나는 당신의 코드를하려고 할거야. –