/
加密代码示例
加密代码示例
PHP 加密代码示例
class PhpExampleCode{
private static function checkMD5($request): bool
{
$key = ‘secretKey';
$data = $request->except('hash');
$string = '';
ksort($data);
foreach ($data as $k => $v) {
if (is_array($v)) {
$v = json_encode($v, JSON_UNESCAPED_SLASHES);
}
$string .= $k . '=' . $v . '&';
}
// unicode string replace
$string = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $string);
return $request->hash === md5(Str::replaceLast('&', $key, $string));
}
}
C# 加密代码示例
class Program
{
static void Main(string[] args)
{
Dictionary<String, dynamic> dict = new Dictionary<string, dynamic>();
dict.Add("param1", 1);
dict.Add("param3", new string[] { "a1", "a2" });
dict.Add("param2", "param2");
Console.WriteLine(EncryptString(ExceptHashAndSort(dict) + "1234"));
}
public static String ExceptHashAndSort(Dictionary<string, dynamic> requestDict)
{
requestDict.Remove("hash");
Dictionary<String, dynamic> sortedDict = requestDict.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
String plain = "";
foreach(KeyValuePair<string, dynamic> dict in sortedDict){
plain += dict.Key + "=";
if (dict.Value is Array) {
plain += System.Text.Json.JsonSerializer.Serialize(dict.Value);
} else {
plain += dict.Value;
}
plain += "&";
}
return plain.Substring(0, plain.Length - 1);
}
public static string EncryptString(string str)
{
// Console.WriteLine(str);
MD5 md5 = MD5.Create();
// Convert String to byte array
byte[] byteOld = Encoding.UTF8.GetBytes(str);
// Call encryption method
byte[] byteNew = md5.ComputeHash(byteOld);
// Convert the encrypted result into a string
StringBuilder sb = new StringBuilder();
foreach (byte b in byteNew)
{
// Convert bytes into hexadecimal character string
sb.Append(b.ToString("x2"));
}
// Return the encrypted string
return sb.ToString();
}
}
Java 加密代码示例
1. HashExampleCode 类
package com.example.demo.util;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.example.demo.util.MD5Util;
import org.springframework.util.StringUtils;
public class HashExampleCode {
/**
* sort the params.
*
* @param object
* @return
*/
private static Map<String, Object> objToSortedMap(Object object) {
Map<String, Object> objMap = JsonUtil.obj2Map(object);
Map<String, Object> sortedMap = new TreeMap<>();
for (Map.Entry<String, Object> entry : objMap.entrySet()) {
if (!StringUtils.isEmpty(entry.getKey()) && !entry.getKey().equals("hash")) {
sortedMap.put(entry.getKey(), entry.getValue());
}
}
return sortedMap;
}
/**
* get the Hash code from request
*
* @param object
* @param secretKey
* @return
*/
public static String getSign(Object object, String secretKey) {
Map<String, Object> sortedMap = objToSortedMap(object);
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
sb.append("&").append(entry.getKey()).append("=");
if (entry.getValue() instanceof List) {
sb.append(JsonUtil.object2Json(entry.getValue()));
} else {
sb.append(entry.getValue().toString());
}
}
String params = sb.toString().replaceFirst("&", "");
return MD5Util.MD5Encode(params + secretKey);
}
}
2. MD5Util 类
package com.example.demo.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* @param origin
* @return string
*/
private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
public static String MD5Encode(String origin) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return byteArrayToHexString(md.digest(origin.getBytes()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return origin;
}
public static String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (byte value : b) {
resultSb.append(byteToHexString(value));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
3. JsonUtil 类
package com.example.demo.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
class JsonUtil
{
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public static Map<String, Object> obj2Map(Object obj) {
return mapper.convertValue(obj, Map.class);
}
public static String object2Json(Object o) {
if (o == null) {
return null;
}
String s = null;
try {
s = mapper.writeValueAsString(o);
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
}
EG:
{
"brandId": 100,
"requestId": "039c630b-10be-43c2-bba1-70c8e0290997",
"playerId": "2",
"playerSessionId": "71f88d44-bc76-42f3-b748-45e2709070e0",
"gameCode": "bfb",
"trans": [
{
"seq": 1,
"transId": "ptxia6xwasc75qksfswqkxd",
"amount": 5,
"transType": "bet",
"transTime": "2023-08-24 07:21:20.434",
"roundId": "789513231360",
"roundType": "normal",
"endRound": 0
}
]
}
加密前的字符串是
brandId=100&gameCode=bfb&playerId=2&playerSessionId=71f88d44-bc76-42f3-b748-45e2709070e0&requestId=039c630b-10be-43c2-bba1-70c8e0290997&trans=[{"seq":1,"transId":"ptxia6xwasc75qksfswqkxd","amount":5,"transType":"bet","transTime":"2023-08-24 07:21:20.434","roundId":"789513231360","roundType":"normal","endRound":0}]mytestsecretkey
, multiple selections available,