appKey&appSecret 加密验签算法

加密方式

请求参数 依次从a-z排列 然后拼接后加入加密app_secret 然后MD5加密 即可得到签名字符串

PHP示例

private static function generateSign($params, $appSecret)
    {
        ksort($params);
        $str = '';
        foreach ($params as $key => $value) {
            $str .= self::percentEncode($key). self::percentEncode($value);
        }
        $str .= $appSecret;
        return md5($str);
    }
    private static function percentEncode($str)
    {
        // 使用urlencode编码后,将"+","*","%7E"做替换即满足 API规定的编码规范
        $res = urlencode($str);
        $res = preg_replace('/\+/', '%20', $res);
        $res = preg_replace('/\*/', '%2A', $res);
        $res = preg_replace('/%7E/', '~', $res);
        return $res;
    }
    

JAVA

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class SignGenerator {

    private static String generateSign(Map<String, String> params, String appSecret) {
        Map<String, String> sortedParams = new LinkedHashMap<>(params);
        Collections.sort(sortedParams.keySet());
        StringBuilder strBuilder = new StringBuilder();
        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
            strBuilder.append(percentEncode(entry.getKey()))
                    .append(percentEncode(entry.getValue()));
        }
        strBuilder.append(appSecret);
        return md5(strBuilder.toString());
    }

    private static String percentEncode(String str) {
        String encoded = java.net.URLEncoder.encode(str, "UTF-8");
        encoded = encoded.replace("+", "%20");
        encoded = encoded.replace("*", "%2A");
        encoded = encoded.replace("%7E", "~");
        return encoded;
    }
   
}

Python

from urllib.parse import quote
import hashlib

def generate_sign(params, app_secret):
    sorted_params = dict(sorted(params.items()))
    str_to_hash = ''
    for key, value in sorted_params.items():
        str_to_hash += percent_encode(key) + percent_encode(value)
    str_to_hash += app_secret
    return hashlib.md5(str_to_hash.encode()).hexdigest()

def percent_encode(s):
    res = quote(s)
    res = res.replace('+', '%20')
    res = res.replace('*', '%2A')
    res = res.replace('%7E', '~')
    return res

Go

package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"sort"
	"strings"
	"net/url"
	"regexp"
)

func generateSign(params map[string]string, appSecret string) string {
	keys := make([]string, 0, len(params))
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	var strToSign strings.Builder
	for _, k := range keys {
		strToSign.WriteString(percentEncode(k))
		strToSign.WriteString(percentEncode(params[k]))
	}
	strToSign.WriteString(appSecret)

	hasher := md5.New()
	hasher.Write([]byte(strToSign.String()))
	return hex.EncodeToString(hasher.Sum(nil))
}

func percentEncode(s string) string {
	encoded := url.QueryEscape(s)
	encoded = regexp.MustCompile(`\+`).ReplaceAllString(encoded, "%20")
	encoded = regexp.MustCompile(`/\*/`).ReplaceAllString(encoded, "%2A")
	encoded = strings.ReplaceAll(encoded, "%7E", "~")
	return encoded
}

func main() {
	params := map[string]string{"param1": "value1", "param2": "value2"}
	appSecret := "yourAppSecret"
	sign := generateSign(params, appSecret)
	fmt.Println("Generated Sign:", sign)
}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

public static class SignGenerator
{
    public static string GenerateSign(Dictionary<string, string> paramsDict, string appSecret)
    {
        var sortedParams = new Dictionary<string, string>(paramsDict);
        sortedParams = sortedParams.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
        var strBuilder = new StringBuilder();
        foreach (var pair in sortedParams)
        {
            strBuilder.Append(PercentEncode(pair.Key)).Append(PercentEncode(pair.Value));
        }
        strBuilder.Append(appSecret);
        return MD5Hash(strBuilder.ToString());
    }

    private static string PercentEncode(string str)
    {
        var encoded = Uri.EscapeDataString(str);
        encoded = Regex.Replace(encoded, "\\+", "%20");
        encoded = Regex.Replace(encoded, "\\*", "%2A");
        encoded = Regex.Replace(encoded, "%7E", "~");
        return encoded;
    }

    // 注意:这里需要一个MD5哈希方法,以下是一个简单的MD5实现示例
    private static string MD5Hash(string input)
    {
        using (var md5 = System.Security.Cryptography.MD5.Create())
        {
            var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
            var hashStringBuilder = new StringBuilder();
            foreach (var byteValue in hashBytes)
            {
                hashStringBuilder.Append(byteValue.ToString("x2"));
            }
            return hashStringBuilder.ToString();
        }
    }
}

ASP

<%
Option Explicit

Function GenerateSign(params, appSecret)
    Dim sortedParams, str, key, value
    Set sortedParams = CreateObject("Scripting.Dictionary")
    For Each key In params.Keys
        sortedParams.Add key, params(key)
    Next
    sortedParams.Sort
    
    str = ""
    For Each key In sortedParams.Keys
        str = str & PercentEncode(sortedParams(key)) & PercentEncode(key)
    Next
    str = str & appSecret
    
    GenerateSign = Hex(MD5(str))
End Function

Function PercentEncode(str)
    Dim res
    res = Server.URLEncode(str)
    res = Replace(res, "+", "%20")
    res = Replace(res, "*", "%2A")
    res = Replace(res, "%7E", "~")
    PercentEncode = res
End Function

' 假设已经有了一个MD5函数,这里只是一个占位符
Function MD5(input)
    ' 在ASP中,可能需要使用第三方库或自定义函数来计算MD5
    ' 这里只是简单地将输入的字符串转换为16进制表示
    MD5 = Hex(CLng(input))
End Function
%>

  • 21
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然,我可以帮您编写一个使用SM国密生成appkeyappsecret的Java代码。以下是示例代码: ``` import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class SMAppKeyGenerator { private static final String ALGORITHM = "SM3withSM2"; private static final String KEY_ALGORITHM = "EC"; private static final String PROVIDER = "GM"; public static void main(String[] args) throws Exception { String appId = "your_app_id"; String appSecret = generateAppSecret(); String appKey = generateAppKey(appId, appSecret); System.out.println("AppId: " + appId); System.out.println("AppSecret: " + appSecret); System.out.println("AppKey: " + appKey); } private static String generateAppSecret() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM, PROVIDER); keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); byte[] encodedPrivateKey = privateKey.getEncoded(); return bytesToHexString(encodedPrivateKey); } private static String generateAppKey(String appId, String appSecret) throws Exception { byte[] appIdBytes = appId.getBytes("UTF-8"); byte[] appSecretBytes = hexStringToBytes(appSecret); byte[] data = new byte[appIdBytes.length + appSecretBytes.length]; System.arraycopy(appIdBytes, 0, data, 0, appIdBytes.length); System.arraycopy(appSecretBytes, 0, data, appIdBytes.length, appSecretBytes.length); MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM, PROVIDER); byte[] digest = messageDigest.digest(data); return bytesToHexString(digest); } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); } private static byte[] hexStringToBytes(String hexString) { int len = hexString.length() / 2; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = (byte) Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16); } return bytes; } } ``` 这段代码使用了SM2算法生成了一个公私钥对,然后使用SM3withSM2算法AppId和AppSecret进行哈希计算,得到AppKey。请注意,这里使用了Bouncy Castle作为Java加密库的提供者,因为它支持SM算法。如果您的Java环境中没有安装Bouncy Castle,您需要先下载并安装它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Soujer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值