在日常开发中,获取md5或者sha256等算法,经常用到,工具类如下:
package com.adx2.server.app.common;
import com.codepal.common.utils.IoUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
/**
* 获取MD5码
*
*/
public class Cipher {
public final static String MD5 = "MD5";
public final static String SHA256 = "SHA-256";
public static String md5AsString(String s) {
return getSafeString(MD5, s);
}
public static String sha256AsString(String s) {
return getSafeString(SHA256, s);
}
public static String getSafeString(String algorithm, String s) {
try {
return getAsString(algorithm, s.getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
return "";
}
}
/**
* 获取指定文件内容对应的MD5码
* @param file 文件
* @return 文件内容对应的MD5码
* @throws Exception 异常定义
*/
public static String getAsString(String algorithm, File file)
throws Exception {
return getAsString(algorithm, loadFromFile(file));
}
/**
* 获取指定文本内容对应的MD5码
* @param plain 文本内容
* @return 文本内容对应的MD5码
* @throws Exception 异常定义
*/
public static String getAsString(String algorithm, String plain) throws Exception {
return getAsString(algorithm, plain.getBytes("UTF-8"));
}
/**
* 获取指定文本内容对应的MD5码
* @param plain 文本内容
* @return 文本内容对应的MD5码
* @throws Exception 异常定义
*/
public static String getAsString(String algorithm, byte[] plain) throws Exception {
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.update(plain);
byte[] buffer = digest.digest();
return toHexByteArray(buffer, 0, buffer.length);
}
/**
* 从指定文件中读取文件内容
* @param file 文件对象
* @return 文件内容
* @throws Exception 异常定义
*/
private static byte[] loadFromFile(File file) throws Exception {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
ByteArrayOutputStream output = new ByteArrayOutputStream();
int length = 0;
byte[] buffer = new byte[64 * 1024];
while (-1 != (length = fis.read(buffer))) {
if (length > 0) {
output.write(buffer, 0, length);
}
}
return output.toByteArray();
} finally {
IoUtils.close(fis);
}
}
/**
* 将数组转换成十六进制字符串
* @param b 数组
* @param m 起始位置
* @param n 个数
* @return 转化后的十六进制字符串
*/
private static String toHexByteArray(byte[] b, int m, int n) {
String md5 = "";
int k = m + n;
if (k > b.length) {
k = b.length;
}
for (int i = m; i < k; i++) {
md5 += Integer.toHexString((b[i] & 0x000000FF) | 0xFFFFFF00).substring(6);
}
return md5.toLowerCase(Locale.getDefault());
}
public static String buildQuery(Map<String, String> params) {
StringBuilder queryBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
// 对参数名和参数值进行编码
String encodedParam = urlEncode(entry.getKey());
String encodedValue = urlEncode(entry.getValue());
// 添加到查询字符串中
if (queryBuilder.length() > 0) {
queryBuilder.append("&");
}
queryBuilder.append(entry.getKey())
.append("=")
.append(encodedValue);
}
return queryBuilder.toString();
}
private static String urlEncode(String params) {
try {
return URLEncoder.encode(params, "UTF-8");
} catch (UnsupportedEncodingException e) {
return params;
}
}
public static void main(String[] args) throws Exception {
TreeMap<String, String> treeMap = new TreeMap<>();
long time = System.currentTimeMillis();
System.out.println("The time:" + time);
treeMap.put("client_key", "123");
treeMap.put("client_secret_key", "345");
treeMap.put("time",time+"");
treeMap.put("return_type","json");
String query = buildQuery(treeMap);
System.out.println("query:" + query);
String token = sha256AsString(query);
System.out.println("token:" + token);
}
}