最近开发项目中遇到一个这样的问题,注册和登录时需要对信息MD5加密生成一个Token传给后台,
后台会对信息进行比较加密是否相同,才表示你登录或者注册成功,所以,IOS和Android两个平台的token值就要相同了。
我第一次做的时候注册或者登录时输入英文注册就没问题,但是输入中文时,和IOS的签名就不一样了,就不能注册和登录了。
MD5简介:
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
MD5算法具有以下特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 强抗碰撞:已知原数据和其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加密的方法改成第二种;才解决前面我说的问题。