我有一个带有用户名和密码的SQL表。密码使用MessageDigest的digest()方法进行编码。如果我编码一个密码 - 让我们说“abcdef12” - 使用MessageDigest的digest()方法然后将其转换为十六进制值,则String与使用PHP的SHA1方法执行相同操作时不同。我希望这些值完全相同。
用于对密码进行编码的代码:
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] passbyte;
passbyte = "abcdef12".getBytes("UTF-8");
passbyte = md.digest(passbyte);
使用此方法将String转换为十六进制:
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()返回的密码 - 函数: d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef
以下是MessageDigest编码的密码: d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef
我忘记了什么吗?
伊戈尔。
编辑:我发现有类似问题的人:C# SHA-1 vs. PHP SHA-1...Different Results?。解决方案是更改编码..但我无法更改服务器端的编码,因为该SQL表中的密码不是由我的应用程序创建的。 我使用JavaScript SHA1类(更确切地说是一个Google Web Toolkit类)使用客户端SHA1编码。它按预期工作和编码字符串,但显然使用ASCII字符?..
答案 0 :(得分:6)
我使用与Java SHA-1散列函数相同的PHP摘要:
public static String computeSha1OfString(final String message)
throws UnsupportedOperationException, NullPointerException {
try {
return computeSha1OfByteArray(message.getBytes(("UTF-8")));
} catch (UnsupportedEncodingException ex) {
throw new UnsupportedOperationException(ex);
}
}
private static String computeSha1OfByteArray(final byte[] message)
throws UnsupportedOperationException {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(message);
byte[] res = md.digest();
return toHexString(res);
} catch (NoSuchAlgorithmException ex) {
throw new UnsupportedOperationException(ex);
}
}
我已添加到我的单元测试中:
String sha1Hash = StringHelper.computeSha1OfString("abcdef12");
assertEquals("d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef", sha1Hash);
该课程的完整源代码为on github。
答案 1 :(得分:4)
它与编码无关。输出完全不同。
对于初学者,您的函数convertStringToHex()
不会输出前导零,即07
变为7
。
其余的(将89
更改为2030
)也可能与该功能有关。尝试在passbyte
之后查看passbyte = md.digest(passbyte);
的值。
答案 2 :(得分:4)
试试这个 - 它对我有用:
MessageDigest md = MessageDigest.getInstance(algorithm);
md.update(original.getBytes());
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
此致 Konki
答案 3 :(得分:2)
或试试这个:
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(clearPassword.getBytes("UTF-8"));
return new BigInteger(1 ,md.digest()).toString(16));
干杯罗伊