彻底解决JAVA和.net MD5加密中文不一致问题
最近开发遇到.net和JAVA用MD5
加密中文不一样的问题
JAVA的MD5 加密方法如下:
public synchronized static final byte[] toMd5(String data,String encodingType) {
MessageDigest digest = null;
if (digest == null) {
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
System.err.println("Failed to load the MD5 MessageDigest. ");
nsae.printStackTrace();
}
}
if (StringUtils.isBlank(data)) {
return null;
}
try {
--最重要的是这句,需要加上编码类型
digest.update(data.getBytes(encodingType));
} catch (UnsupportedEncodingException e) {
digest.update(data.getBytes());
}
return digest.digest();
}
public static String MD5Encode(String origin,String encodingType) {
byte[] md5Bytes = toMd5(origin,encodingType);
return byteArrayToHexString( md5Bytes);
}
public static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
最后在客户端的调用方法为:
String key = MD5.MD5Encode(code+rMessage+userKey,"UTF-8");
这样的加密结果跟.NET加密结果一样
JAVA的MD5 加密方法如下:
public synchronized static final byte[] toMd5(String data,String encodingType) {
MessageDigest digest = null;
if (digest == null) {
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
System.err.println("Failed to load the MD5 MessageDigest. ");
nsae.printStackTrace();
}
}
if (StringUtils.isBlank(data)) {
return null;
}
try {
--最重要的是这句,需要加上编码类型
digest.update(data.getBytes(encodingType));
} catch (UnsupportedEncodingException e) {
digest.update(data.getBytes());
}
return digest.digest();
}
public static String MD5Encode(String origin,String encodingType) {
byte[] md5Bytes = toMd5(origin,encodingType);
return byteArrayToHexString( md5Bytes);
}
public static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
最后在客户端的调用方法为:
String key = MD5.MD5Encode(code+rMessage+userKey,"UTF-8");
这样的加密结果跟.NET加密结果一样