mysql 提供直接的加解密函数 aes_encrypt() 和 aes_decrypt() ,我们就是直接使用这两个函数。方法比较简单,在需要加解密的字段上,使用 @ColumnTransformer 注解,来调用aes_encrypt() 和 aes_decrypt() 函数。但需要注意的是,aes_encrypt() 加密之后是二进制数据,因此数据库字段类型需要使用 blob,如果你的应用是全新开发的,那么问题不大,但是如果需要在已有的项目中加上数据加密特性,那么你需要修改现有数据库的库表结构,这样代价就比较大了,因此我们可以使用 mysql 的 hex() 函数,将这个二进制的数据,转换为十六进制字符串存储入数据库中。同理,读取时先用 unhex() 函数将十六进制字符串重新转换为二进制数据,再进行解密操作得到最终结果。
实体类
@Entity
@Table(name = "test_user",catalog = "")
public class TestUser implements Serializable {
/**用户id*/
private Integer userId;
/**用户名*/
private String userPhnoe;
/**登录名*/
private String userIdCard;
/**用户密码*/
private String userAddress;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id",nullable=true )
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Basic
@Column(name = "user_phnoe",nullable=false ,length=128)
@ColumnTransformer(
read = "AES_DECRYPT(UNHEX(user_phnoe),'ankon')",
write = "HEX(AES_ENCRYPT(?, 'ankon'))"
)
public String getUserPhnoe() {
return userPhnoe;
}
public void setUserPhnoe(String userPhnoe) {
this.userPhnoe = userPhnoe;
}
@Basic
@Column(name = "user_idcard",nullable=false ,length=128)
@ColumnTransformer(
read = "AES_DECRYPT(UNHEX(user_idcard),'ankon')",
write = "HEX(AES_ENCRYPT(?, 'ankon'))"
)
public String getUserIdCard() {
return userIdCard;
}
public void setUserIdCard(String userIdCard) {
this.userIdCard = userIdCard;}
@Basic
@Column(name = "user_address",nullable=false ,length=1024)
@ColumnTransformer(
read = "CAST(AES_DECRYPT(UNHEX(user_address),'ankon')as char(1024))",
write = "HEX(AES_ENCRYPT(?, 'ankon'))"
)
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
}
mapper文件中的查询
<select>
SELECT
test_user.`user_id` userId,
AES_DECRYPT(UNHEX(user_phnoe), 'ankon') userPhnoe ,
AES_DECRYPT(UNHEX(user_idcard), 'ankon') userIdCard,
CAST(AES_DECRYPT(UNHEX(user_address), 'ankon') as char(1024)) userAddress
FROM test_user
WHERE test_user.`user_idcard` = HEX(AES_ENCRYPT(#{userIdCard}, 'ankon'))
</select>
参考文献:https://blog.csdn.net/cuiyaoqiang/article/details/90106376