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;
    }
}

 

posted on 2023-07-20 11:09  邢帅杰  阅读(380)  评论(0编辑  收藏  举报