• 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加密的方法改成第二种;才解决前面我说的问题。

  • 相关阅读:
    poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
    new和delete2
    new和delete1
    new和delete4
    new和delete3
    new(placement new)
    用例图中的Actor(参与者)一定是人吗?
    二维数组的函数参数传递
    二维指针动态创建二维数组(C/C++)
    OOD的五项基本原则——SOLID
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7530540.html
Copyright © 2020-2023  润新知