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 []?
是的,问题很可能出在byte[]
对String
转换.您必须知道SHA生成原始byte
数组,并且无法保证任意byte[]
将产生有效String
,无论编码如何.因此,您的代码只是偶然地工作.
完全避免这个问题:
byte[]
在BLOB中存储raw - 最安全,最有效的存储方式.在Hibernate中,只需byte[]
在POJO上使用属性即可.
byte[]
使用base64编码(在Java中检出Decode Base64数据)并将其存储为字符串.
BTW 记得腌制!
归档时间: |
|
查看次数: |
13879 次 |
最近记录: |