【发布时间】:2013-06-01 19:07:36
【问题描述】:
我想将一个序列化的对象存储到一个文件中,但是我想让它加密。它不需要非常强大的加密。我只想要一些简单的东西(最好是几行代码),这会让其他人更难加载。我已经调查了 SealedObject,但关键是阻碍了我。理想情况下,我只想传递一个字符串作为加密/解密对象的密钥。
有什么建议吗?
【问题讨论】:
标签: java object encryption
我想将一个序列化的对象存储到一个文件中,但是我想让它加密。它不需要非常强大的加密。我只想要一些简单的东西(最好是几行代码),这会让其他人更难加载。我已经调查了 SealedObject,但关键是阻碍了我。理想情况下,我只想传递一个字符串作为加密/解密对象的密钥。
有什么建议吗?
【问题讨论】:
标签: java object encryption
试试这个代码:
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 );
【讨论】:
在这里使用CipherOutPutStream (http://docs.oracle.com/javase/6/docs/api/javax/crypto/CipherOutputStream.html) 将对象写入 ObjectOutputStream 可能是一种简单而好的方法。
【讨论】:
您应该查看Jasypt。它有很多实用功能可以让这一切变得简单。
...
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);
...
【讨论】:
使用 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
【讨论】:
作为一般答案(因为这些天我不怎么使用 Java):
我建议搜索多种加密形式并找到适合您想要执行的操作,然后查找和修改已为您的数据编写的模块或根据您希望使用的算法编写您自己的模块.
例如,如果您想使用 SHA256 并发现已经为您编写的模块,只需修改它以使用您想要的数据流。
private ObjectName modifiedSHA256(input stream, ..., ...)
{
// Modified algorithm
}
然后你可以在你想在某处写入数据流时调用它。然后模块将保存自己的数据流,然后将其写入文件。
【讨论】:
javax.crypto.SealedObject 绝对是答案。钥匙有什么问题?
【讨论】:
您根本就不能使用任何加密库吗?你的基本代码是
Object o=...;
String s= new String();
ObjectOutputStream out = new ObjectOutputStream(StringStream(s));
out.writeObject(o);
然后您只需将s 传递到您想要的任何加密系统。
编辑:我忘记了 StringStream 是 C++ 的东西,而不是 Java 的东西。但是你基本上可以做同样的事情,看看here。
【讨论】: