2013-06-05 5 views
1

Я хотел бы сохранить сериализованный объект в файл, но я хотел бы сделать его зашифрованным. Это не должно быть действительно сильное шифрование. Я просто хочу что-то легкое (желательно пару строк кода max), что сделает его немного сложнее для кого-то другого для загрузки. Я просмотрел SealedObject, но ключ удерживает меня. В идеале я хотел бы просто передать String в качестве ключа для шифрования/дешифрования объекта.Есть ли простой способ шифрования java-объекта?

Любые предложения?

ответ

3

Вы должны изучить Jasypt. У этого есть куча полезных функций, чтобы сделать это легким.

... 
BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); 
textEncryptor.setPassword(myEncryptionPassword); 
... 
String myEncryptedText = textEncryptor.encrypt(myText); 
... 
String plainText = textEncryptor.decrypt(myEncryptedText); 
... 
5

Использование CipherOutPutStream (http://docs.oracle.com/javase/6/docs/api/javax/crypto/CipherOutputStream.html) записать объекты в ObjectOutputStream может быть простой и хороший подход здесь.

+0

Спасибо! это послало меня по правильной дороге, и теперь у меня это работает. Я нашел эту страницу, которая сделала ее довольно простой.http: //www.java2s.com/Code/Java/Security/EncryptingandDecryptingwiththeJCE.htm – user2041469

0

Невозможно использовать любую библиотеку шифрования? Ваш основной код будет

Object o=...; 
String s= new String(); 
ObjectOutputStream out = new ObjectOutputStream(StringStream(s)); 
out.writeObject(o); 

А затем вы просто передаете s в любую систему шифрования, которую хотите.

Edit: Я забыл, что stringStream это с ++ вещь, а не в Java, но вы можете basicalyl сделать то же самое, посмотрите here

0

В качестве общего ответа (так как я не использую Java много этих дней):

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

Например, если вы хотите использовать SHA256 и нашли уже написанный для вас модуль, просто измените его, чтобы использовать необходимый поток данных.

private ObjectName modifiedSHA256(input stream, ..., ...) 
{ 
    // Modified algorithm 
} 

И тогда вы можете позвонить ему, когда хотите записать поток данных где-нибудь. Затем модуль сохранит свой собственный поток данных, который затем будет записан в файл.

8

Попробуйте этот код:

String fileName = "result.dat"; //some result file 

//You may use any combination, but you should use the same for writing and reading 
SecretKey key64 = new SecretKeySpec(new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }, "Blowfish"); 
Cipher cipher = Cipher.getInstance("Blowfish"); 

//Code to write your object to file 
cipher.init(Cipher.ENCRYPT_MODE, key64); 
Person person = new Person(); //some object to serialise 
SealedObject sealedObject = new SealedObject(person, cipher); 
CipherOutputStream cipherOutputStream = new CipherOutputStream(new BufferedOutputStream(new FileOutputStream(fileName)), cipher); 
ObjectOutputStream outputStream = new ObjectOutputStream(cipherOutputStream); 
outputStream.writeObject(sealedObject); 
outputStream.close(); 

//Code to read your object from file 
cipher.init(Cipher.DECRYPT_MODE, key64); 
CipherInputStream cipherInputStream = new CipherInputStream(new BufferedInputStream(new FileInputStream(fileName)), cipher); 
ObjectInputStream inputStream = new ObjectInputStream(cipherInputStream); 
SealedObject sealedObject = (SealedObject) inputStream.readObject(); 
Person person1 = (Person) sealedObject.getObject(cipher); 
+0

Могу ли я задать вам вопрос? Что делать, если я не хочу, чтобы он был файлом? Мне просто нужен байт [], который я буду кодировать с помощью Base64 и преобразовать его в строку. Есть ли способ сделать это? Я нашел один способ, но это длинный выстрел, и почему-то я чувствую его плохо. Незлая помощь. –

+0

Тогда вы не должны использовать FileOutputStream –

+0

Еще один быстрый вопрос: должен ли я использовать закрытый объект, когда я использую сериализацию? Я использую ByteArrayInputStream, но получаю разные результаты. У меня есть вопрос здесь. http://crypto.stackexchange.com/questions/14619/decryption-returns-different-data –

0

Используйте SealedObject и Cipher класс для шифрования и дешифрования объекта.

Что такое SealedObject?

SealedObject инкапсулирует исходный объект java (он должен реализовывать Serializable). Он использует криптографический алгоритм для уплотнения сериализованного содержимого объекта.

Что такое шифр?

Это класс java, используйте криптографический алгоритм для шифрования и дешифрования.

Пример кода

ниже приведен пример кода.

EncriptThisClass so = new EncriptThisClass(); 
SealedObject encryptedObject =encryptObject(so); 
EncriptThisClass etcObject=decryptObject(encryptedObject); 

Полный код приведен ниже. http://javaant.com/object-encryption-decryption-in-java/#.VvkA6RJ96Hs

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