java - Sha1 哈希字符串在 mysql 中正确编码,但显示为 Java 字符串

标签 java mysql string sha1 apache-commons-codec

我目前正在使用 Dao 模式开发一个 java 程序和一个 mysql 数据库。我有一些用户信息要存储在表中,我正在存储原始密码字符串的 Sha1 散列版本。我正在使用 apache.commons.codec.digest.DigestUtils 来做到这一点。在 php-mysql 中显示的字符串是完美的,但是当我试图在 java 测试程序中显示相同的字符串时,我得到了完全不同的结果。

这是我的用户对象的构造函数:

public User(int id, String name, String firstName, String email, String login, String password)
    {
        super(id, name, firstName); 
        this.email = email;
        this.login = login;
        //Convert the password to SHA1 before storing it in the object
        //using Apache commons-codec-1.9 lib
        this.hashedPassword = DigestUtils.sha1Hex(password);
    }

因此,例如,当创建一个密码为“aff”的用户时, 通过

User user1 = new User(1, "Durand", "Jack", "jack.durand@mymail.com", "jack", "aff"); 

我明白了 mysql 中的“0c05aa56405c447e6678b7f3127febde5c3a9238”看起来正确,与在线 sha1 哈希器的输出相同。

但是当将数据读回对象并通过 java 中的 Sysout(User.getPassword()) 显示时,我得到 “c14b77e8930a8bfd884c8917f2b7335501a39dde”显然不一样。

知道是什么原因造成的吗?我已经阅读了一些关于 Byte[] 问题的先前帖子,但据说 DigestUtils.sha1Hex(password) 方法返回一个纯字符串。那我错过了什么?

最佳答案

你所做的一切都是正确的。

“0c05aa56405c447e6678b7f3127febde5c3a9238”是正确的输出。

我怀疑 MySQL 正在读取之间进行更新。

我的建议是,检查值“0c05aa56405c447e6678b7f3127febde5c3a9238”是否实际保存到 MySQL。打开工作台并访问该行以检查其值。

如果 MySQL 中的值是正确的,那么它是在从 RDBMS -> Java 的转换中。如果您将属性密码定义为字符串,那么 Hibernate(或您正在使用的任何东西)应该保持该字段不变。

关于java - Sha1 哈希字符串在 mysql 中正确编码,但显示为 Java 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622239/

相关文章:

java - 如何在 Selenium 中测试 "Remember Me"复选框功能

java - 使用 BroadcastReceiver 从 LAST INSTALLED 应用程序中获取包名称、通用名称和图标

java - 如何从 Intent 中获取额外的日期?

MySQL 存储过程变量

php - PDO 代码和 PHP 未定义错误

java - 检查字符串是否包含反斜杠?

Java 正则表达式错误 - 没有第 1 组

mysql - 如何在mysql中明确选择具有不同行数和列数的表?

python - 删除列名称中不需要的字符串

Java:为什么我的字符串会通过 UDP 损坏?