gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:39 24 4
gpt4 key购买 nike

我正在使用 Hibernate/Java 将实体持久保存到数据库中。该实体有一个密码 字段,它是一个字符串。在我的应用程序中注册用户时,我使用 SHA-1 散列密码(我承认这有点弱)。这会产生一个 byte[] ,然后我将其转换为 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。我想我最好避免 String 转换。那么我该如何设计我的数据库,使 Hibernate 生成的实体类为 password 字段提供 byte[] 而不是 String

最佳答案

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

通过以下方式完全避免该问题:

  • 在 BLOB 中存储原始 byte[] - 最安全和最有效的存储方式。在 Hibernate 中,只需在 POJO 上使用 byte[] 属性。

  • 使用 编码 byte[] (查看 Decode Base64 data in Java )并将其存储为字符串。

顺便说一句 remember about salting !

关于java - 如何使用 Hibernate 映射 byte[] 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com