Android----- MD5加密(登录注册得到与IOS相同的加密值,并且解决两个平台汉字加密不相同问题)

最近开发项目中遇到一个这样的问题,注册和登录时需要对信息MD5加密生成一个Token传给后台,

后台会对信息进行比较加密是否相同,才表示你登录或者注册成功,所以,IOS和Android两个平台的token值就要相同了。

我第一次做的时候注册或者登录时输入英文注册就没问题,但是输入中文时,和IOS的签名就不一样了,就不能注册和登录了。

MD5简介:

     Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

     MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

MD5算法具有以下特点:
  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 容易计算:从原数据计算出MD5值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  4. 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD

Token值中也包含了时间戳,得到时间戳的几种方式:

      long i=System.currentTimeMillis();
      long i2=Calendar.getInstance().getTimeInMillis();
      long i3=new Date().getTime();

第一次开发时用的MD5加密,英文时和IOS相同,但是汉字就不相同了。

public static final String MD5(String inStr) {
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
        char[] charArray = inStr.toCharArray();
        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];

        byte[] md5Bytes = md5.digest(byteArray);

        StringBuffer hexValue = new StringBuffer();

        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16)
                hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }

        return hexValue.toString();
    }

后面为了解决这个,查阅资料,弄了这个MD5加密方式,才能输入汉字也能与IOS的加密方式相同了。

public static String stringToMD5(String string) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10)
                hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString().toLowerCase();
    }

看着差不多,其实还是有所区别的,起初以为是编码格式的问题;

便把输入的值转成UTF-8的格式,用第一种方式来请求接口,但是还是不行;

所以才把MD5加密的方法改成第二种;才解决前面我说的问题。

原文地址:https://www.cnblogs.com/zhangqie/p/7530540.html