Java 由一个进行加密和序列化---由另一个进行反序列化和解密
我有可序列化对象:Java 由一个进行加密和序列化---由另一个进行反序列化和解密,java,encryption,serializable,Java,Encryption,Serializable,我有可序列化对象: import java.io.Serializable; public class ConfigObject implements Serializable{ private String url; private String user; private String pass; public String getUrl() { return url; } public void setUrl(String url) { this.url = url
import java.io.Serializable;
public class ConfigObject implements Serializable{
private String url;
private String user;
private String pass;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
和SerializableEncryptDecrypt类中的2个方法:
public static void encrypt(Serializable object, OutputStream ostream, byte[] keyy, String transformationnn) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
try {
// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec(keyy, transformationnn);
// Create cipher
Cipher cipher = Cipher.getInstance(transformationnn);
cipher.init(Cipher.ENCRYPT_MODE, sks);
SealedObject sealedObject = new SealedObject(object, cipher);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(ostream, cipher);
ObjectOutputStream outputStream = new ObjectOutputStream(cos);
outputStream.writeObject(sealedObject);
outputStream.close();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
}
public static Object decrypt(InputStream istream, byte[] keyy, String transformationnn) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
SecretKeySpec sks = new SecretKeySpec(keyy, transformationnn);
Cipher cipher = Cipher.getInstance(transformationnn);
cipher.init(Cipher.DECRYPT_MODE, sks);
CipherInputStream cipherInputStream = new CipherInputStream(istream, cipher);
ObjectInputStream inputStream = new ObjectInputStream(cipherInputStream);
SealedObject sealedObject;
try {
sealedObject = (SealedObject) inputStream.readObject();
return sealedObject.getObject(cipher);
} catch (ClassNotFoundException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
return null;
}
}
我制作了两个软件(soft1和soft2),它们使用这个类(SerializableEncryptDecrypt
)。软件加密和序列化输入数据(相同的输入数据)。当我比较输出数据和输入数据时,我给出的是完全不同的数据。但我需要相同的输出数据
提前感谢您的帮助。使用一些salt(nonce,IV,…)随机加密是一种很好的做法,因此即使您使用相同的密钥使用相同的值进行加密,也可能(并且应该)得到不同的输出。在某些情况下,具有相同的输出会降低安全性 我不能确定,但我敢打赌“SealeObject”就是这么做的。如果确实需要“相同的输出”,可以直接序列化对象(不使用SealeObject)。但是,然后-您负责存储salt、身份验证标签等
请注意-如果您在某个实际项目中使用此代码,则不应存储密码(即使是加密的),必要时只应存储其加密哈希。请正确设置代码格式。