code 参考:Android下实现字符串或文件的MD5加密 https://blog.csdn.net/qq_19942717/article/details/127555520
package com.jay.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5加密工具 * */ public class Md5Utils { public static String get(String text) { String result = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(text.getBytes()); result = toHexString(digest); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } return result; } public static String get(InputStream inputStream) { String result = null; try { byte[] buffer = new byte[8192]; int len; MessageDigest md = MessageDigest.getInstance("MD5"); while ((len = inputStream.read(buffer)) != -1) {//分多次读入文件,占用内存比较少 md.update(buffer, 0, len); } inputStream.close(); byte[] digest = md.digest(); result = toHexString(digest); } catch (Exception ex) { ex.printStackTrace(); if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } public static String get(File file) { String result = null; try { result = get(new FileInputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } return result; } private static String toHexString(byte[] digest) { StringBuilder sb = new StringBuilder(); String hexStr; for (byte b : digest) { hexStr = Integer.toHexString(b & 0xFF);//& 0xFF处理负数 if (hexStr.length() == 1) {//长度等于1,前面进行补0,保证最后的字符串长度为32 hexStr = "0" + hexStr; } sb.append(hexStr); } return sb.toString(); } }
sign
package com.jay.common; import com.alibaba.fastjson.JSON; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Map; /** * 签名类 * */ public class SignUtils {/** * 得到签名字符串,先Md5后Base64 */ public static String signMd5Base64(Map<String, String> queryMap, String key) { String jsonStr = signMd5(queryMap, key); byte[] bytes = jsonStr.getBytes(StandardCharsets.ISO_8859_1);// Charset.forName("ISO-8859-1") //DEFAULT 这个参数是默认,使用默认的方法来加密 //NO_PADDING 这个参数是略去加密字符串最后的”=” //NO_WRAP 这个参数意思是略去所有的换行符(设置后CRLF就没用了) //CRLF 这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF //URL_SAFE 这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/ String encodeData = new String(android.util.Base64.encode(bytes, android.util.Base64.NO_WRAP));return encodeData; } /** * 得到签名字符串,Md5 */ public static String signMd5(Map<String, String> queryMap, String key) { String[] queryKeys = queryMap.keySet().toArray(new String[0]); Arrays.sort(queryKeys); StringBuilder source = new StringBuilder(); int len = queryKeys.length; for (int i = 0; i < len; i++) { String queryKey = queryKeys[i]; String v = queryMap.get(queryKey); // 值为空的不参与签名 if (v != null && v != "") { source.append(queryKey).append("=").append(v).append("&"); } } source.append("key=").append(key);//MD5加密 String md5Value = Md5Utils.get(source.toString()).toUpperCase(); queryMap.put("sign", md5Value); String jsonStr = JSON.toJSONString(queryMap);//fastjsonreturn jsonStr; } /** * 字符串转Base64 * */ public static String StringToBase64(String jsonStr) { byte[] bytes = jsonStr.getBytes(StandardCharsets.ISO_8859_1);// Charset.forName("ISO-8859-1") //DEFAULT 这个参数是默认,使用默认的方法来加密 //NO_PADDING 这个参数是略去加密字符串最后的”=” //NO_WRAP 这个参数意思是略去所有的换行符(设置后CRLF就没用了) //CRLF 这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF //URL_SAFE 这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/ String encodeData = new String(android.util.Base64.encode(bytes, android.util.Base64.NO_WRAP)); return encodeData; } }