[英]Spring JPA @Converter - How to encrypt entity using it's own id as salt?
因此,在这种情况下,JPA实体使用其自己的ID作为Salt进行了加密。
这是不带注释执行en / decrypt的示例,我必须“手动”为每个加密字段创建自定义get / setter。
StandardDbCipher
只是我的密码类,在构造期间接受盐(在本例中为ID字段)。 密码已在其他文件中固定。
@Entity
public class Applicant implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String profilePic;
private String contact;
private String personalInfo;
@Transient
private StandardDbCipher cipher;
private StandardDbCipher getCipher() {
if (cipher == null) {
cipher = new StandardDbCipher(id);
}
return cipher;
}
private String encrypt (String plain) {
return getCipher().decrypt(plain);
}
private String decrypt (String crypt) {
return getCipher().encrypt(crypt);
}
public String getProfilePic() {
return decrypt(profilePic);
}
public void setProfilePic(String profilePic) {
this.profilePic = encrypt(profilePic);
}
public String getContact() {
return decrypt(contact);
}
public void setContact(String contact) {
this.contact = encrypt(contact);
}
public String getPersonalInfo() {
return decrypt(personalInfo);
}
public void setPersonalInfo(String personalInfo) {
this.personalInfo = encrypt(personalInfo);
}
}
我想使用@Converter
简化代码并减少样板,但无法弄清楚如何将ID设置为salt? 有任何想法吗? 也许其他注释?
如果您需要在许多实体中执行此操作,那么我认为您可以尝试面向方面的编程(最著名的实现是AspectJ)。 Spring也对此进行了集成(因为我没有使用Spring,所以我没有使用它)。 这个想法是,您可以在调用对象的方法(在您的情况下为实体的getter / setter方法)之前或之后执行一些拦截代码,并且在其中可以操纵实际的对象/参数/返回值。
您可以在执行setter方法之前调用crypto方法,并将加密后的值传递给setter。 对于解密,可以在执行getter方法之后运行您的解密方法。
这样,您的实体将保持为简单的POJO,并且您无需为每个实体提供转换器。
。 以下是一些演示AOP概念的教程:
更新:另一个解决方案可能是使用JPA实体侦听器 。 您可以在实体中对@PrePersist
进行加密,对@PostLoad
回调进行解密,或者对所有此类实体使用单个侦听器类。 您只需要这样注释您的POJO:
@Entity
@EntityListeners(class=EncDecListener.class)
public class Applicant implements Serializable {
}
public class EncDecListener {
@PreUpdate
public void encrypt(Applicatnt a) {
// do encryption
}
@PostLoad
public void decrypt(Applicatnt a) {
// do decryption
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.