如何使用Hibernate映射byte []属性?

Say*_*eji 8 java string encoding hibernate sha1

我正在使用Hibernate/Java将实体持久化到数据库.该实体有一个密码字段,它是一个字符串.在我的应用程序中注册用户时,我使用SHA-1哈希密码(我承认这有点弱).这将产生一个字节[]我再转换为字符串使用 new String(byte[] arr); 每当我想在注销用户,我只是从数据库中检索哈希密码(如字符串),并将其与输入密码的摘要在登录时使用比较 hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));

这工作完全在我的开发系统(Windows 7中,JDK 1.6.0_23/JDK 1.7中,MySQL 5.5,Tomcat的6.0.26),但在我们的服务器上部署它(在Linux上运行JDK 1.6)中,等号方法从不计算真实的,即使对于相同的密码.我快速设置了一个新的开发系统(Ubuntu 12.04,MySQL 5.5,JDK 1.7.0_03,Tomcat 7.0.22),它也不能在那里工作.

我知道String类文档中针对String类所述的可能的编码问题,并且在SO的几个地方也有说明.我在这个论坛上尝试了几种编码(例如Base64,Latin-1),最后我得到了UnsupportedEncodingException.我想我最好避免String转换.那么我如何设计我的数据库,以便Hibernate生成的实体类为密码字段而不是字符串提供byte []

Tom*_*icz 5

是的,问题很可能出在byte[]String转换.您必须知道SHA生成原始byte数组,并且无法保证任意byte[]将产生有效String,无论编码如何.因此,您的代码只是偶然地工作.

完全避免这个问题:

  • byte[]在BLOB中存储raw - 最安全,最有效的存储方式.在Hibernate中,只需byte[]在POJO上使用属性即可.

  • byte[]使用编码(在Java中检出Decode Base64数据)并将其存储为字符串.

BTW 记得腌制!