簡體   English   中英

Spring JPA @Converter-如何使用實體自己的id作為鹽來加密實體?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM