首页 > 编程语言 >appKey&appSecret 加密验签算法

appKey&appSecret 加密验签算法

时间:2024-05-27 15:57:54浏览次数:25  
标签:appKey return string res appSecret params str 验签 encoded

加密方式

请求参数 依次从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
%>

标签:appKey,return,string,res,appSecret,params,str,验签,encoded
From: https://blog.csdn.net/Soujer/article/details/139240384

相关文章

  • 对接银行支付,自己的demo可以调通,放到项目里,却总提示验签失败。原来竟是因为...
    原因是字符集(charset)不一致对接一个银行支付通道的支付API,自己java写的demo可以调通,放到项目工程里,部署到环境上,总是收到验签失败的响应。这个问题,困扰我们的开发大兄弟长达一个星期。对接通道接口联调不通,常见的场景有许多,如:签名原串需要对key进行排序。不同的排序算法会导......
  • 国密 SM2 的非对称签名验签过程
    国密SM2的非对称签名验签过程介绍非对称加密确保了消息传输中的保密性,但是由于使用公钥加密,而公钥是分发出去的,可能泄露,谁都可以使用公钥加密发送消息。因此为了保证收到的消息是由对应的发送者发出的,就需要用到非对称签名和验签逻辑,发送者通过自己的私钥进行对消息进行签名,......
  • [实战]API防护破解之签名验签
    前言:传统的接口在传输的过程中,是非常容易被抓包进行篡改,从而进行中间人攻击。这时候我们可以通过对参数进行签名验证,如果参数与签名值不匹配,则请求不通过,直接返回错误信息,从而防止黑客攻击或者大大增加了黑客攻击的成本。白帽子在挖洞的时候也经常会遇到这种情况,大多数不会逆向......
  • 【HMS Core】应用内支付成功后,返回结果验签失败
    ​【问题描述】应用内支付成功后,返回结果验签失败 【解决方案】验签失败可以从以下几点进行逐一排查1.签名算法是否匹配(可以通过获取getSignatureAlgorithm来验证目前使用的签名算法)​2.签名公钥是否正确​确保公钥获取正确,签名算法如果打开了SHA256WithRSA/PSS,则建议......
  • QT使用OpenSSL的接口实现RSA2的签名和验签
    QT使用OpenSSL的接口实现RSA2的签名和验签加密和签名在RSA加密算法中是两个不同的概念,虽然它们都涉及RSA密钥对的使用,但目的和应用场景有所不同。加密(encrypt/decrypt):加密:使用接收方的公钥对数据进行加密,只有拥有相应私钥的接收方才能解密数据。解密:使用接收方的私钥对......
  • edusrc-appkey泄露
    edusrc-appkey泄露简介AppKey泄露是指应用程序的应用密钥(AppKey)或API密钥被非法访问或公开的安全事件。AppKey是应用程序与第三方服务或API进行安全通信的凭证,通常用于身份验证和数据加密。如果这些密钥泄露,攻击者可以利用它们来访问敏感数据、执行未授权的操作或冒充合法的服务......
  • 关于“公钥加密私钥解密,私钥加签公钥验签”的一些理解
    看了网上的很多资料,发现有些点没有说到,也比较复杂,这里根据个人的理解,简单描述,方便记忆。 先理解公/私钥(yue)的意思:私钥,即 私人 的钥匙,是唯一的,所以可以用来证明来源是特定的人公钥,即 公用 的钥匙,我可以将它给很多人(公众)。所以既然那么多人都知道,所以公钥并不能证明来源......
  • JAVA实现RSA加密、解密、加签、验签
    1、工具类RSAUtils.javaimportjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.io.ByteArrayOutputStream;importjavax.crypto.Cipher;importjava.security.*;importjava.util.*;publicclassRSAUtils{/......
  • 支付宝 v3 验签如何实现
    上次给大家介绍了支付宝v3自签名如何实现,这次顺便再把验签也写一下。为什么要验签说起为什么要验签,如果要详细一点解释的话,可以写很多很多......我们就简单一点来解释:验签可以证明接收到的信息是支付宝给我的,不是被人中途拦截篡改数据之后再发给我的。支付宝的通知分为「同步......
  • C语言RsaUtil,C语言Rsa验证签名,验签----自测OK
    摘自:https://www.dandelioncloud.cn/article/details/1498198300963708930 //RsaUtil.c#include<string>usingnamespacestd;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<openssl/rsa.h>#include<openss......