Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android md5加密与mysql或php不匹配?_Java_Android_Security_Md5 - Fatal编程技术网

Java android md5加密与mysql或php不匹配?

Java android md5加密与mysql或php不匹配?,java,android,security,md5,Java,Android,Security,Md5,**问题已解决。我的输入在从EditText到Java的过程中被修改,我在Java中运行该函数。这也很明显。我觉得自己很笨。我真的很抱歉浪费了大家的时间 我试图让android使用MD5加密字符串,但发现它与MySQL和PHP中使用的MD5函数的结果不匹配 例如: PHP/MYSQL: 字符串:passwordhash:5f4dcc3b5aa765d61d8327deb882cf99 安卓: 字符串:passwordhash:bc4a7f3b32b2a85688a53c49df19cd95 我搜

**问题已解决。我的输入在从EditText到Java的过程中被修改,我在Java中运行该函数。这也很明显。我觉得自己很笨。我真的很抱歉浪费了大家的时间

我试图让android使用MD5加密字符串,但发现它与MySQL和PHP中使用的MD5函数的结果不匹配

例如:

PHP/MYSQL: 字符串:
password
hash:
5f4dcc3b5aa765d61d8327deb882cf99

安卓: 字符串:
password
hash:
bc4a7f3b32b2a85688a53c49df19cd95

我搜索并查看了stackoverflow上有相同问题的人,但仍然没有找到答案我使用了许多方法并尝试更改字符代码,但它仍然不匹配

以下是我当前保存在项目中的函数(该函数不起作用):


任何帮助都将不胜感激。

两件事。。。首先,我要避免为此使用
biginger
。您希望将字节数组转换为十六进制表示形式,因此请使用专门设计的代码,例如。当您想关注MD5输出是什么时,它将阻止您跟踪转换问题。编辑:好的,听起来好像代码不是问题,获取输入是-但我仍然会在这里进行更改。它应该以更可读的代码结束,这些代码更清楚地表达了您试图实现的目标

第二,该守则:

md.update(input.getBytes());

。。。正在使用平台默认编码。这几乎从来都不是个好主意。明确指定编码,即使您知道平台默认编码是什么。在这种情况下,它是无害的,但无论如何你都应该修复代码,以防你不得不处理非ASCII文本。

问题很可能是由于字符编码。我知道你说过你尝试了不同的字符代码,但是你发布的代码没有

检查此问题的答案:

MessageDigest类可以为您提供MD5的实例 消化

始终在使用字符串和加密类时,请确保 始终指定字节表示形式所用的编码。如果 您只需使用string.getBytes(),它将使用平台默认值。(不是 所有平台使用相同的默认设置)

byte[]bytesOfMessage=yourString.getBytes(“UTF-8”)


隐马尔可夫模型。。。当我在标准Sun JVM(1.6)中运行代码时,我得到了正确的输出。我认为这与
input.getBytes()
无关,因为Android上的默认字符集应该是UTF-8。它可能与
MessageDigest
有关。尽管如此,我还是会尝试使用
getBytes(“UTF-8”)
来明确说明。当您将字符串更改为字节数组时,是否尝试使用相同的字符串编码?除了依赖平台默认编码之外,代码片段看起来还可以(尽管Android已经使用UTF-8)。您确定输入中没有空格吗?对于另一个代码片段,请参见:似乎我的输入在从EditText获取到Java的过程中发生了变化。。。我觉得自己很笨。这是用于密码哈希的吗?普通的md5/sha1/sha2对于密码散列来说是个坏主意。虽然您完全正确,但对于只包含ASCII字符的单词来说,这并不重要。它在几乎每个字符编码中产生相同的字节(除了古代的类似ASCII的EBCDIC)。根据使用的字符编码,只有超出ASCII范围的字符才能给出不同的字节。示例输入仅包含ASCII兼容字符,因此不指定字符编码不是OP具体问题的原因。此外,您并没有真正解释为什么
biginger
是个坏主意,我对此很好奇。@BalusC:虽然在这种特殊情况下,它只有ASCII字符,但使用默认编码是一个等待发生的错误,所以我不提这一点。我怀疑问题出在这里的
biginger
上-我不知道为什么它会失败(它在桌面Java上对我有效),但从根本上说,它似乎不是一种明智的方法来做一些与大整数无关的事情-它是关于字节的十六进制表示。嗯,答案暗示这是OP的具体问题的两个可能原因之一(因此在这个特殊情况下是不真实的)。好的,你很容易猜到,
biginger
是可能的原因。我仍然想知道为什么它会失败,因为它应该可以正常工作,即使它滥用了
biginger
类。@BalusC:看到评论后,看起来这是一个完全不同的问题-但我仍然会做两个更改:)已编辑以反映这一点。我的原始函数确实将字节数组转换为十六进制,但在它不起作用后,我开始尝试我能找到的任何东西。结果我的输入被改变了。我真的很难过现在发布这个。。。
md.update(input.getBytes());