【发布时间】:2012-02-10 19:33:39
【问题描述】:
** 问题已解决。我的输入在从 EditText 到运行该函数的 Java 的过程中被更改。这也很明显。我真的觉得很笨。浪费大家的时间真的很抱歉……
我正在尝试让 android 使用 MD5 加密字符串,但发现它与 MySQL 和 PHP 中使用的 md5 函数的结果不匹配。
例如:
PHP/MYSQL:
字符串:password 哈希:5f4dcc3b5aa765d61d8327deb882cf99
安卓:
字符串:password 哈希:bc4a7f3b32b2a85688a53c49df19cd95
我已经搜索并查看了 stackoverflow 上遇到相同问题的人,但我仍然没有找到答案。 我使用了很多方法并尝试更改字符代码,但仍然无法匹配。
这是我目前保存在项目中的函数(这不起作用):
public static String md5(String input){
String result = input;
if(input != null) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
if ((result.length() % 2) != 0) {
result = "0" + result;
}
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
return result;
}
任何帮助将不胜感激。
【问题讨论】:
-
嗯...当我在标准 Sun JVM (1.6) 中运行您的代码时,我得到了正确的输出。我认为它与
input.getBytes()没有任何关系,因为Android 上的默认字符集应该是UTF-8。它可能与MessageDigest有关。尽管如此,我会尝试使用getBytes("UTF-8")来明确。 -
在将字符串转换为字节数组时,是否尝试使用相同的字符串编码?
-
Snippet 看起来不错,因为依赖于平台默认编码(尽管 Android 已经使用 UTF-8)。您确定输入中没有空格吗?对于另一个 sn-p,另请参阅:stackoverflow.com/questions/5494447/…
-
看来我的输入确实在从 EditText 抓取到 Java 的过程中发生了变化......我觉得真的很愚蠢。
-
这是否用于密码散列?普通的 md5/sha1/sha2 对于密码哈希来说是个坏主意。