使用 JASYPT + Hibernate + Spring 进行字符串加密

String Encryption with JASYPT + Hibernate + Spring

我成功地将我的 Spring Hibernate 后端与 Jasypt 集成。 根据以下实体 class 我已经加密了它的 name 字段,由于加密过程现在发生数据库学生 table 的姓名列包含加密数据。

我需要知道,

1) 当我编写一些 DAO 查询以通过他的名字搜索某个学生时,我是否必须将 搜索文本 作为纯文本传递或者我也必须加密该值?

2) 使用 DAO 查询时,当我列出所有学生的姓名排序时,它假设根据数据库级别的加密值或解密(真实)值进行排序(这意味着 Jasypt 会为我解密这些值)?

谢谢。

实体class

@Entity
@Table(name = "student")
public class Student implements Serializable {

    @Id
    @GeneratedValue 
    @Column(name = "ID")
    private Integer id;

    @Type(type="encryptedString")
    @Column(name = "name")
    private String name;
}

DAO class

     public interface StudentRepository extends CrudRepository<Student, Integer> JpaSpecificationExecutor<Student> {

        public List<Student> findByName(String searchText);  

        public List<Student> findAll(null, (new Sort(Direction.ASC, "name")));  
     }

来自Jasypt page on Hibernate

But encryption sets a limitation on your Hibernate usage: security standards establish that two different encryption operations on the same data should not return the same value (due to the use of a random salt). Because of this, none of the fields that are set to be encrypted when persisted can be a part of a WHERE clause in your search queries for the entity they belong to.

这不允许搜索学生姓名。这是意料之中的,因为 Jasypt 不执行 homomorphic encryption(即允许某些操作的加密)。同态加密还处于起步阶段,大多数实现不能直接部署到现场。

加密搜索查询无效,因为加密不确定。 IE。即使您加密了搜索查询,您仍然会因为随机盐而得到不同的值。

一般来说,我不会将诸如学生姓名之类的基本信息标记为机密信息。如果确实需要加密,您最好加密整个数据库。