开发者社区> 问答> 正文

关于MD5加密同一个字符串调用方式不同,返回密文不同。见鬼啦!!!!!? 400 报错

关于MD5加密同一个字符串调用方式不同,返回密文不同。见鬼啦!!!!!? 400 报错

这是MAIN方法请求调用加密方法返回的密文是:c4e479cfc417f1dfc4853be31523d1bf

public static void main(String[] args) {
     
    String name = "深圳市";
     
    String password = "963963";
     
    String md5Value = MyUtils.getMD5(name+"#"+password);
     
    System.out.println(md5Value);
}



这是前端请求Action调用加密方法返回的密文是:274ff6824a5efe75314cdc6848831c66 

public ActionForward test1(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
throws Exception {
  
    String name = "深圳市";
     
    String password = "963963";
     
    String md5Value = MyUtils.getMD5(name+"#"+password);
     
    System.out.println(md5Value);
     
    return null;
}



这是md5加密方法:

public static String getMD5(String x) {
	  String s = null;
	  char hexDigits[] = {       // 用来将字节转换成 16 进制表示的字符
	     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',  'e', 'f'}; 
	   try
	   {
	    java.security.MessageDigest md = java.security.MessageDigest.getInstance( "MD5" );
	    md.update( x.getBytes() );
	    byte tmp[] = md.digest();          // MD5 的计算结果是一个 128 位的长整数,
	                                                // 用字节表示就是 16 个字节
	    char str[] = new char[16 * 2];   // 每个字节用 16 进制表示的话,使用两个字符,
	                                                 // 所以表示成 16 进制需要 32 个字符
	    int k = 0;                                // 表示转换结果中对应的字符位置
	    for (int i = 0; i < 16; i++) {          // 从第一个字节开始,对 MD5 的每一个字节
	                                                 // 转换成 16 进制字符的转换
	     byte byte0 = tmp[i];                 // 取第 i 个字节
	     str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字节中高 4 位的数字转换, 
	                                                             // >>> 为逻辑右移,将符号位一起右移
	     str[k++] = hexDigits[byte0 & 0xf];            // 取字节中低 4 位的数字转换
	    } 
	    s = new String(str);                                 // 换后的结果转换为字符串

	   }catch( Exception e )
	   {
	    e.printStackTrace();
	   }
	   return s;
	 }

中文的字符一直都有问题,如果是单纯的数字字符没有问题。求救呀!

展开
收起
爱吃鱼的程序员 2020-06-03 15:05:59 796 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    去和网上的方法比较,如果你的结果不对,说明你的程序有错,不要问为什么。######

    引用来自“jorneyr”的答案

    去和网上的方法比较,如果你的结果不对,说明你的程序有错,不要问为什么。
    因为main方法执行的密文在网上是正确的。
    ######建议换个md5加密方法调用试试,比如Apache的加密######

    其实你两个结果都是对的,只不过一个是把字符串UTF8编码后的结果, 

    ######

    引用来自“figer1”的答案

    其实你两个结果都是对的,只不过一个是把字符串UTF8编码后的结果, 

    因为中文已经不能转码了,可否把中文字符转byte数组类型,然后再转UTF-8就达到效果了?
    ######

    兄弟,你这个问题怎么解决的呀,我今天也见鬼了。


    ######需要制定为“utf-8”编码。md.update( x.getBytes(“utf-8”) );
    2020-06-03 17:10:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于可信计算与加密计算 打造云上原生计算安全 立即下载
\"视频服务特色解决方案——直播连麦与点播加密 \" 立即下载
量子加密通信技术 立即下载