Sha1在mysql中正确编码的散列字符串,但显示为不同的Java字符串

时间:2014-05-13 03:17:37

标签: java mysql string sha1 apache-commons-codec

我目前正在使用Dao模式开发一个与mysql数据库相结合的java程序。我有一些用户信息存储在一个表中,我正在存储原始密码字符串的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"); 

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

但是当把数据读回到一个对象并通过java中的Sysout(User.getPassword())显示它时我得到了 " c14b77e8930a8bfd884c8917f2b7335501a39dde"这显然不是一样的。

知道造成这种情况的原因是什么?我已经读过一些关于Byte []问题的帖子,但据说DigestUtils.sha1Hex(密码)方法返回一个普通的String。那我错过了什么?

1 个答案:

答案 0 :(得分:0)

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

" 0c05aa56405c447e6678b7f3127febde5c3a9238"是正确的输出。

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

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

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