2012-06-08 33 views
2

我想一个例子:Java的比较SHA-256散列字符串密码明文字符串

String hashAlgorithm ="sha-256" 
... 
md=MessageDigest.getInstance(hashAlgorithm); 
byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes()); 
if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) { 
    ... 
} 

然而,散列密码存储在数据库中的字符串。当我做这种比较时,它会失败。当我调试它时,enteredPasswordDigest有32个字节长度,而realPassword.getBytes()有64个字节长度。

我错过了什么?

+0

你确定realPassword.getBytes()的长度是64位(= 8字节)而不是字节吗?因为我不知道可以创建64位输出的安全散列函数。 – Robert

回答

0

我解决我的问题与观点:哈希密码作为数据库字符串是“十六进制”。这是主要的一点。所以我得到了输入密码的字节数组摘要的十六进制。然后我比较了具有十六进制值的字符串。

+0

既然您已经管理好了您所寻找的内容,那么您可能需要考虑查看它以提高安全性。 – Jeach

0

假设realPassword是一个字符串,问题可能是Java字符串是UTF16,即每个字符2个字节。尝试打印两个字节数组,以更好地了解发生了什么。

1

简单,

  • 需要输入的密码和散列/消化它
  • 转换byte[]
  • 该字符串比较已经散列密码字符串中的DB

试试这个,

String hashedStr = new String(enteredPasswordDigest); 
if (!hashedStr.equals(realPassword)) { 
    ... 
} else { 
    ... 
} 

文档:String.getBytes()

这种方法时此字符串不能在 默认字符集进行编码的行为是未指定的。当需要对编码过程进行更多控制时,应使用java.nio.charset.CharsetEncoder 类。

+0

hashedStr的长度是32,但realPassword是64? – kamaci

+0

@kamaci:'realPassword.getBytes().length'是64,我没有使用它。只需使用字符串'realPassword'本身,如我的帖子所示。而且长度确实是32. –