博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于中文MD5本地访问加密和HTTP访问时的问题解决
阅读量:6961 次
发布时间:2019-06-27

本文共 1238 字,大约阅读时间需要 4 分钟。

  hot3.png

先来看看这段代码:

/**

  * 计算签名
  *
  *  content
  *
  */
 public static String sign(String content, String charset) {
  if (charset == null || "".equals(charset)) {
   charset = DEFAULTCHARSET;
  }
  String sign = "";
  try {
   content = new String(content.getBytes(), charset);
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   sign = BASE64Encoder.encode(md5.digest(content.getBytes(charset)));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return sign;
 }

得到待转换内容的字节,按照要求的字符集转换,利用MD5加密,并进行BASE64编码,通用的做法,表面上看并无问题。

结果就出现在字节转换上面.......

我本地访问该方法得到的签名和通过服务(HTTP)访问得到签名居然不一致,用英文试试,没问题......

将待转换内容字节输出,比较看了一下,不一致

030839_eeIr_726947.png

修改代码:

public static String sign(String content, Charset charset) {

  if (charset == null || "".equals(charset)) {
   charset = DEFAULTCHARSET;
  }
  String sign = "";
  try {
   byte[] contentByte = new byte[1024];
   contentByte = content.getBytes(charset);
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   sign = BASE64Encoder.encode(md5.digest(contentByte));
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return sign;
 }

解决了。

031531_FgXP_726947.png

问题总结:在获取参数内容后,转换字节数组居然没带参数,取默认参数的话,本地运行取的是应用字符集,如果http访问的话,我猜应该是浏览器或ISO8859-1字符集吧,转字节数组就乱了,后面就都白忙活了。

转载于:https://my.oschina.net/mrkai/blog/618382

你可能感兴趣的文章
tomcat 设置内存
查看>>
怎么一边敲代码还能一边赚点钱,一字一字敲的,不喜勿喷哈,IOS手机看进来...
查看>>
libevent evhttp_uri_get_query coredump
查看>>
程序员该当命归何处?
查看>>
Log4j调试
查看>>
Most common latch classes and what they mean
查看>>
java 获取数据库表结构通用方法
查看>>
tc命令——Linux基于IP进行流量限速
查看>>
linux centos yum安装LAMP环境
查看>>
Spring中的@Scope注解
查看>>
我的友情链接
查看>>
我用的Android Studio插件
查看>>
有关linq to sql中数据类型转换问题
查看>>
html_3基础
查看>>
在 PHP 中实现整数溢出
查看>>
数据类型和Json格式
查看>>
CodeIgniter连接数据库
查看>>
vi vim配置
查看>>
PP日志-Day 3
查看>>
eclipse 调试 jdk 看不到变量的值
查看>>