Spring Data JPA 和Mybattis 的实现敏感信息mysql数据加密存储解密查询

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值