有没有一种简单的方法来加密 java 对象?
Posted
技术标签:
【中文标题】有没有一种简单的方法来加密 java 对象?【英文标题】:Is there an easy way to encrypt a java object? 【发布时间】:2013-06-01 19:07:36 【问题描述】:我想将一个序列化的对象存储到一个文件中,但是我想让它加密。它不需要非常强大的加密。我只想要一些简单的东西(最好是几行代码),这会让其他人更难加载。我已经调查了 SealedObject,但关键是阻碍了我。理想情况下,我只想传递一个字符串作为加密/解密对象的密钥。
有什么建议吗?
【问题讨论】:
【参考方案1】:试试这个代码:
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 );
【讨论】:
我可以问你一个问题吗?如果我不想要它作为文件怎么办?我只想要我将使用 Base64 编码的 byte[] 并将其转换为字符串。有没有办法做到这一点?我找到了一种方法,但它是一个很长的镜头,不知何故我觉得它很糟糕。请帮忙。 那么你不应该使用 FileOutputStream 另一个快速的问题,我是否必须在使用序列化时使用密封对象?我正在使用 ByteArrayInputStream 执行此操作,但我得到了不同的结果。我有这个问题。 crypto.stackexchange.com/questions/14619/… 要点是使用相同的密码参数。因此,如果您使用一些 key64 序列化对象并使用 Blowfish,则在读取对象时应该使用相同的 key64 和 Blowfish 类型。【参考方案2】:在这里使用CipherOutPutStream
(http://docs.oracle.com/javase/6/docs/api/javax/crypto/CipherOutputStream.html) 将对象写入 ObjectOutputStream 可能是一种简单而好的方法。
【讨论】:
谢谢!这让我走上了正确的道路,现在我可以正常工作了。我发现这个页面很容易。java2s.com/Code/Java/Security/…【参考方案3】:您应该查看Jasypt。它有很多实用功能可以让这一切变得简单。
...
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);
...
【讨论】:
【参考方案4】:使用 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
【讨论】:
【参考方案5】:作为一般答案(因为这些天我不怎么使用 Java):
我建议搜索多种加密形式并找到适合您想要执行的操作,然后查找和修改已为您的数据编写的模块或根据您希望使用的算法编写您自己的模块.
例如,如果您想使用 SHA256 并发现已经为您编写的模块,只需修改它以使用您想要的数据流。
private ObjectName modifiedSHA256(input stream, ..., ...)
// Modified algorithm
然后你可以在你想在某处写入数据流时调用它。然后模块将保存自己的数据流,然后将其写入文件。
【讨论】:
【参考方案6】:javax.crypto.SealedObject
绝对是答案。钥匙有什么问题?
【讨论】:
【参考方案7】:您根本就不能使用任何加密库吗?你的基本代码是
Object o=...;
String s= new String();
ObjectOutputStream out = new ObjectOutputStream(StringStream(s));
out.writeObject(o);
然后您只需将s
传递到您想要的任何加密系统。
编辑:我忘记了 StringStream
是 C++ 的东西,而不是 Java 的东西。但是你基本上可以做同样的事情,看看here。
【讨论】:
以上是关于有没有一种简单的方法来加密 java 对象?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种简单的方法来处理(转换)SkiaSharp 中的一组对象?