版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jielundewode/article/details/79042756
最近换了个比较扯淡的C后台,登录密码MD5加密想必大家都用到了,网上一大堆代码,联调时发现问题了,操蛋的密码和C后台不一致,C后台的MD5密码高位不补0,网上大部分都是补零的,凑够32位,问题由此而来!
直接上代码吧:
/**
* 通过MD5算法加密;
* @param pwd
*/
private static String encoder(String pwd) {
try {
//1指定算法类型;
MessageDigest digest =MessageDigest.getInstance("MD5");
//2将需要加密的字符串转换成byte数组;
//注意我们后台编码时Unicode,此处编码根据后台编码走
byte[] bs = digest.digest(pwd.getBytes("UTF-16LE"));
//3通过遍历bs 生成32位的字符串;
//最后字符串有个拼接的过程;
StringBuffer sb =new StringBuffer();
for (byte b : bs) {
int i=b&0xff; //int 类型的i 是4个字节占32位;
//int 类型的i转换成16进制字符;
String hexString = Integer.toHexString(i);
// if (hexString.length()<2) {//补零的过程,因为生成的时候有的是一位有的是两位所以需要有个补零的过程;
// hexString="0"+hexString;
// }
sb.append(hexString);
}
return sb.toString() ;
} catch ( Exception e) {//找不到指定算法的错误;
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
测试代码如下:
public static void main(String[] args) {
// /.a@b,c;
String s = "123456.a@b,c;";
String test1 =encoder( s);
System.err.println("dd=" + test1);
System.err.println("ee="+ "83c699114729d7d168e748b52882f31");
System.out.println(test1.equals("83c699114729d7d168e748b52882f31"));
System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
String s1="*)897+-=_}{|\"/.'p]lhlKGHdf1453..a@b,c;";
String test2 =encoder( s1);
System.err.println("dd=" + test2);
System.err.println("ee="+ "832179b8eae58adbe5824c7d41a9f778");
System.out.println(test2.equals("832179b8eae58adbe5824c7d41a9f778"));
System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
String s3="中文12~5)/-.a@b,c;";
String test3 =encoder( s3);
System.err.println("dd=" + test3);
System.err.println("ee="+ "4c195f467e7238d58bffdcf9ae9074");
System.out.println(test3.equals("4c195f467e7238d58bffdcf9ae9074"));
}
看下输出:
正常了,天下太平!