[英]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.