【发布时间】:2011-11-28 03:30:15
【问题描述】:
我有一个包含用户名和密码的 SQL 表。密码使用 MessageDigest 的 digest() 方法进行编码。如果我使用 MessageDigest 的 digest() 方法对密码进行编码 - 比如说“abcdef12”,然后将其转换为十六进制值,则字符串与使用 PHP 的 SHA1 方法进行相同操作时不同。不过,我希望这些值完全相同。
用于对密码进行编码的代码:
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] passbyte;
passbyte = "abcdef12".getBytes("UTF-8");
passbyte = md.digest(passbyte);
字符串到十六进制的转换是使用这种方法完成的:
public static String convertStringToHex(String str) {
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
hex.append(Integer.toHexString((int) chars[i]));
}
return hex.toString();
}
密码:abcdef12
这是许多 SHA1-hash 在线生成器和 PHP SHA1()-function 返回的密码:d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef
这是 MessageDigest 编码的密码:d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef
我是不是忘记了什么?
伊戈尔。
编辑:我发现有人遇到类似问题:C# SHA-1 vs. PHP SHA-1...Different Results?。解决方案是更改编码。但我无法更改服务器端的编码,因为该 SQL 表中的密码不是由我的应用程序创建的。 我使用 JavaScript SHA1 类(更准确地说:Google Web Toolkit 类)使用客户端 SHA1 编码。它按预期工作和编码字符串,但显然使用 ASCII 字符?..
【问题讨论】: