我正在使用 Hibernate/Java 将实体持久保存到数据库中。该实体有一个密码字段,它是一个String。在我的应用程序中注册用户时,我使用 SHA-1 对密码进行哈希处理(我承认这有点弱)。这会产生一个byte[] ,然后我将
其转换为Stringnew String(byte[] arr);
每当我想登录用户时,我只需从数据库中检索散列密码(作为String)并将其与登录时输入密码的摘要进行比较
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)时,equals方法甚至永远不会评估为 TRUE对于相同的密码。我快速设置了一个新的开发系统(Ubuntu 12.04、MySQL 5.5、JDK 1.7.0_03、Tomcat 7.0.22),但它也不能在那里工作。
我知道String类的 Java API 文档中说明的可能的编码问题,并且在 SO 的几个地方也有说明。我尝试了这个论坛上建议的几种编码(例如 Base64、Latin-1),最终得到了UnsupportedEncodingException。我想我最好避免字符串转换。那么如何设计我的数据库,以便 Hibernate 生成的实体类为密码字段提供byte[]而不是String?