Hibernate字段数据加密

  • 介绍

本文介绍如何利用Hibernate的事件机制实现实体字段数据的透明加解密。

上面的话有点绕,这里简单说一下思路:通过在实体类(Entity)的属性上添加注解,实现该字段在存取时的数据加解密。这里利用了Hibernate提供的几个Listener来实现,包括:pre-insert、post-insert、post-load。

我们的步骤是:在数据入库前进行加密操作,在从数据库查出来后解密。

  • 例子

  • 源码

本文隐藏内容 登陆 后才可以浏览

属性加解密注解类:

通用方法类:

本文隐藏内容 登陆 后才可以浏览

出库后的解密监听器:

本文隐藏内容 登陆 后才可以浏览

入库前的加密监听器:

本文隐藏内容 登陆 后才可以浏览

加密工具类:

  • Hibernate配置

本文隐藏内容 登陆 后才可以浏览

  • UUID

生成UUID的例子:

  • 源码

https://github.com/LinuxSuRen/com.surenpi.hibernate

《Hibernate字段数据加密》有33个想法

  1. 你好,SVN怎么申请登录,我想下载DESUtil工具类,或者发我邮箱可以吗,jiangbolh@sohu.com ,谢谢

          1. 你好,不知道你有没有遇到onPreUpdate 会触发两次的问题,有什么好的办法避免吗?

          2. 我是在保存USR对象的时候,注册PRE_INSER事件监听在onPreUpdate方法中将USER对象的身份证信息加密。这时候我发现会调用两次onPreUpdate,update语句也会发两次。

          3. 发两次SQL的问题已经解决了,需要修改event.getState以及同时通过PO的setter方法修改event.getEntity相应属性值,不然会引起 hibernate脏数据的检查,从而引发多次update。

          4. 如果只通过event.getState()或者PO的setter方法修改,都会引起发两次update的问题,两者缺一不可

        1. 在 onPreInsert或者onPreUpdate方法里调用加密的方法的时候。
          try {
          String encryptStr = EncryptUtil.encrypt(field, entity);
          //需要修改event.getState,且同时通过PO的setter方法修改了event.getEntity相应属性值,
          //否则会引发hibernate脏数据检查,从而引发多次update.
          states[index] = encryptStr;
          Method setterMethod = EncryptUtil.getSetter(field, entity);
          setterMethod.invoke(entity,encryptStr);
          } catch (Exception e) {
          e.printStackTrace();
          }

        1. 不对啊,我去注册显示我的邮箱号被注册了- -但是找回密码还是显示未验证- –

  2. 再请教一个问题,我们这边更新有的是merge的方法,不知道这个方法怎么去对值加密呢?我试了load和insert都没有问题,但是merge这个方法弄了好久,还是没有进展。

  3. 我看了一下你的配置,感觉是不是有点不正确, 这个里面应该是SuRenPreIntoListener吧,这个里面应该是SuRenPostOutListener吧

      1. 我的意思是,那个配置文件里面的这一段,pre-update这个type对应的class不正确,应该对应的是org.suren.SuRenPreIntoListener这个class

          1. 呵呵,应该感谢你,你这篇文章对我帮助很大。另外还有一个建议,现在hibernate4已经不支持这样配置监听了,可以用其它的实现方式,可以用新的方式实现,请参考:http://blog.csdn.net/z69183787/article/details/43454271

发表评论

电子邮件地址不会被公开。 必填项已用*标注