3
回答
Java自带的MD5加密算法,同样的参数 生成的结果不同?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
就是这个方法:
byte[] bytes = MessageDigest.getInstance("MD5").digest(param.getBytes());


代码很简单

String param = "action=MORE-PROBALITY&age=-1&app_key=483OedYnY945yTfdUd5Rxruf&app_secret=1rogPFfwMpa3U5cgrjsns99wy2QSx909&gender=1&symptom_word=呕吐&timestamp=1456392710093&uuid=867886020293415";
		byte[] bytes = MessageDigest.getInstance("MD5").digest(param.getBytes());
		for (byte b : bytes) {
			LogUtils.info("MD5-Byte:" + b);
		}



使用上边的param 传入,在 eclipse 里 正常使用,可是 打成jar包 老是 出现问题,后来排查 发现 这个加密方法  竟然 同样 的参数  两个地方的结果不同。





可是 我把 param 换成 比如 "111" 对比了一下,发现 又一样了。

好奇怪。。。

举报
Inszt
发帖于2年前 3回/1K+阅
共有3个答案 最后回答: 2年前

param.getBytes()方法换一下。在获取字节数组的时候要指定编码,不然会使用默认编码。然而windows和linux的默认编码不同,导致得到的字节数组不一样,加密得到的结果自然也不一样了。。。。

--- 共有 6 条评论 ---
Inszt回复 @hhshenhuaxx : 确实是这样,在系统内 执行jar包的默认 编码 是 gbk,eclipse 内是utf-8;指定编码 就可以了。多谢。 2年前 回复
行业协汇袁斌回复 @hhshenhuaxx : 嗯, 确实如此, getBytes这个方法是平台相关的, 难怪会有问题, 这也可以理解, 没有指定编码当然按照系统默认的编码来操作了。。。 2年前 回复
hhshenhuaxx回复 @hhshenhuaxx : 不信 你弄一个中文的string,getBytes()和getBytes(String decode) decode可以为各种编码,然后比较一下得到的字节数组。绝对各不相同。 2年前 回复
hhshenhuaxx回复 @犯贱智障人士专职医生 : 按你的说话读到的String是一致的,然后string.getBytes()呢? 你看一下jdk api 绝逼有一个String.getBytes(String decode) 的方法,这个方法的意思就是按照指定的编码格式获取字节数组。如果不传这个decode,它就会按默认的来获取。 2年前 回复
行业协汇袁斌这个有道理,但是这个参数不是硬编码保存在文件中的吗, 文件自身的编码是固定的。在执行程序的时候读取的内容在不同的操作系统下应该是一致的吧。。。 2年前 回复
顶部