我正在使用Hibernate/Java将实体持久化到数据库。该实体有一个密码字段,它是一个字符串。当在我的应用程序中注册用户时,我使用SHA-1散列密码(我承认这有点弱)。这将产生一个的byte []然后我用 new String(byte[] arr);
每当我要登录用户转换为字符串,我只是从数据库中检索哈希密码(如字符串),并将其与消化比较(Windows 7中,JDK 1.6.0_23/JDK 1.7中,MySQL 5.5,Tomcat的6.0.26)使用 hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
如何使用Hibernate映射byte []属性?
在登录时输入的密码,这完全工作在我的开发系统,但在我们的服务器上部署它(在Linux上运行JDK 1.6),等于方法nev即使对于相同的密码,er也会评估为TRUE。我很快设置了一个新的开发系统(Ubuntu 12.04,MySQL 5.5,JDK 1.7.0_03,Tomcat 7.0.22),并且它在那里也不起作用。
我知道在Java API文档中提到的字符串类中可能出现的编码问题,也在SO上的几个地方声明。我已经尝试了一些在这个论坛上提出的编码(例如Base64,Latin-1),并且我最终得到了UnsupportedEncodingException。我想我会避免字符串转换更好。那么如何设计我的数据库,使Hibernate生成的实体类与byte []为密码字段而不是字符串?
+1,非常好的问题。除此之外,这不是您的问题的答案,我使用一些Commons Base64公用程序进出数据库非常幸运。 –
为什么要存储代表数字的字符串而不是存储数字本身? – m0skit0
不要使用一轮哈希来保护密码。使用像PBKDF2或bcrypt这样的东西,其数千甚至数十万次 - 即使是100k也不是不合理的。直接存储固定长度的字节[]应该对于更多的数据库来说很容易,但是您可以始终从字节数组中创建一个BigInteger,并将其作为数字类型存储。 – erickson