前后端关于关键信息数据论证,防止被篡改了,需要MD5码比对校验,以保证数据的准确可靠。本人参与的公司项目前端使用Unity C#,后台是Java实现的。因此,在这里贴出自己写的MD5生成的工具类。
服务端Java代码实现如下:
public class Md5Util {
private static final ThreadLocal<MessageDigest> MESSAGE_DIGEST_CACHE = new ThreadLocal<MessageDigest>();
private static char md5Chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* 获取一个字符串的md5码
* @param str 源串
* @return md5码
*/
public static String getMD5Str(String str) {
try {
MessageDigest messagedigest = getMessageDigest();
messagedigest.update(str.getBytes("UTF-8"));
return bufferToHex(messagedigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static MessageDigest getMessageDigest() throws NoSuchAlgorithmException {
MessageDigest messagedigest = MESSAGE_DIGEST_CACHE.get();
if (messagedigest == null) {
messagedigest = MessageDigest.getInstance("MD5");
MESSAGE_DIGEST_CACHE.set(messagedigest);
}
return messagedigest;
}
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = md5Chars[(bt & 0xf0) >> 4];
char c1 = md5Chars[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
}
Unity客户端C#实现如下:
/*
* Author:W
* MD5码生成工具
*/
using Newtonsoft.Json;
using Newtonsoft.Json.Utilities;
using System.Security.Cryptography;
using System.Text;
public class MD5Utils
{
public static char[] md5CharArr = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/// <summary>
/// MD5字符串加密
/// </summary>
/// <param name="content"></param>
/// <returns>加密后字符串</returns>
public static string GenerateMD5(string content)
{
string md5Str="";
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] buffer = md5.ComputeHash(Encoding.UTF8.GetBytes(content));
md5Str = BufferToHex(buffer);
return md5Str;
}
/// <summary>
/// 将MD5加密后的字节数组转换成16进制字符
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
private static string BufferToHex(byte[] buffer)
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < buffer.Length; i++)
{
AppendHexPair(buffer[i], stringBuilder);
}
return stringBuilder.ToString();
}
/// <summary>
/// byte转换16进制
/// </summary>
/// <param name="bt"></param>
/// <param name="stringBuilder"></param>
private static void AppendHexPair(byte bt, StringBuilder stringBuilder)
{
// 取字节中高 4 位的数字转换
char c0 = md5CharArr[(bt & 0xf0) >> 4];
// 取字节中低 4 位的数字转换
char c1 = md5CharArr[bt & 0xf];
stringBuilder.Append(c0);
stringBuilder.Append(c1);
}
}