全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

签名DEMO

最近更新时间:2021-08-13 15:24:54

php

//使用时把sign方法拷贝到代码工程内即可
function sign($params, $secret_key)
{
    ksort($params, SORT_STRING);
 
    $str_encode = '';
    foreach($params as $k=>$v) {
        $str_encode .= rawurlencode($k).'='.rawurlencode($v).'&';
    }
    $str_encode = substr($str_encode, 0, -1);
 
    return hash_hmac("sha256", $str_encode, $secret_key);
}
 
 
$arr =[
 'Accesskey'=> 'AKLTXQVF0pOmS6aahIrD5r0B3Q',
 'Service'=> 'iam',
 'Action'=> 'CreateUser',
 'Version'=> '2015-11-01',
 'Timestamp'=> '2021-08-12T02:47:36Z',
 'SignatureVersion'=> '1.0',
 'SignatureMethod'=> 'HMAC-SHA256',
 'UserName' => 'Ttest',
 'RealName' => '周四测试',
 'Email' => '[email protected]',
 'Remark' => '~ce shi*%#|+',
 ];
$sk = 'OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==';
$signature = sign($arr, $sk);
 
var_dump($signature); //fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659

java

package com.ksyun.util;
 
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
 
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/***
    使用时,把测试相关方法删掉。测试方法包括:main,test1,test2
    把这个类拷贝到自己的工程内
    签名调用:SignatureUtils.signature(params, secretKey)
**/
/**
 * @author [email protected]
 */
public class SignatureUtils {
 
    private static final Pattern ENCODED_CHARACTERS_PATTERN;
 
    static {
        StringBuilder pattern = new StringBuilder();
        pattern.append(Pattern.quote("+"))
            .append("|")
            .append(Pattern.quote("*"))
            .append("|")
            .append(Pattern.quote("%7E"))
            .append("|")
            .append(Pattern.quote("%2F"));
        ENCODED_CHARACTERS_PATTERN = Pattern.compile(pattern.toString());
    }
 
    /**
     * 注意空格( )会编码成+号,所以+最后需要替换成%20(%20为空格)
     * 在URLEncode后需对三种字符替换:加号(+)替换成 %20、星号(*)替换成 %2A、 %7E 替换回波浪号(~)
     */
    private static String urlEncode(final String value, final boolean path) {
        if (value == null) {
            return "";
        }
 
        try {
 
            String encoded = URLEncoder.encode(value, StandardCharsets.UTF_8.name());
            Matcher matcher = ENCODED_CHARACTERS_PATTERN.matcher(encoded);
            StringBuffer buffer = new StringBuffer(encoded.length());
 
            while (matcher.find()) {
                String replacement = matcher.group(0);
                if ("+".equals(replacement)) {
                    replacement = "%20";
                } else if ("*".equals(replacement)) {
                    replacement = "%2A";
                } else if ("%7E".equals(replacement)) {
                    replacement = "~";
                } else if (path && "%2F".equals(replacement)) {
                    replacement = "/";
                }
 
                matcher.appendReplacement(buffer, replacement);
            }
            matcher.appendTail(buffer);
            return buffer.toString();
        } catch (UnsupportedEncodingException ex) {
            throw new RuntimeException(ex);
        }
    }
 
    private static String getCanonicalizedQueryString(Map<String, Object> params) {
        final Map<String, String> tmap = new TreeMap<>();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            String encodedParamName = urlEncode(key, false);
            String encodedValues = urlEncode(value.toString(), false);
            tmap.put(encodedParamName, encodedValues);
        }
 
        final StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : tmap.entrySet()) {
            if (sb.length() > 0) {
                sb.append("&");
            }
            sb.append(entry.getKey()).append('=').append(entry.getValue());
        }
        return sb.toString();
    }
 
    public static String signature(Map<String, Object> params, String secretKey) {
        String canonicalizedQueryString = getCanonicalizedQueryString(params);
        return new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey).hmacHex(canonicalizedQueryString);
    }
 
    public static void test2() {
        String accesskey = "AKLTXQVF0pOmS6aahIrD5r0B3Q";
        String secretKey = "OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==";
 
        Map<String, Object> params = new HashMap<>();
        params.put("Accesskey", accesskey);//公共参数
        params.put("Service", "iam");//公共参数
        params.put("Action", "CreateUser");//公共参数
        params.put("Version", "2015-11-01");//公共参数
        params.put("Timestamp", "2021-08-12T02:47:36Z");//公共参数
        params.put("SignatureVersion", "1.0");//公共参数
        params.put("SignatureMethod", "HMAC-SHA256");//公共参数
        params.put("UserName", "Ttest"); //api特有参数
        params.put("RealName", "周四测试");//api特有参数
        params.put("Email", "[email protected]");//api特有参数
        params.put("Remark", "~ce shi*%#|+");//api特有参数
 
        System.out.println(signature(params, secretKey));
    }
 
    public static void test1() {
        String accesskey = "AKLTXQVF0pOmS6aahIrD5r0B3Q";
        String secretKey = "OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==";
 
        Map<String, Object> params = new HashMap<>();
        params.put("Accesskey", accesskey); //公共参数
        params.put("Service", "iam"); //公共参数
        params.put("Action", "GetUser"); //公共参数
        params.put("Version", "2015-11-01"); //公共参数
        params.put("Timestamp", "2021-08-06T07:45:36Z"); //公共参数
        params.put("SignatureVersion", "1.0"); //公共参数
        params.put("SignatureMethod", "HMAC-SHA256"); //公共参数
        params.put("UserName", "freestest"); //api特有参数
 
        System.out.println(signature(params, secretKey));
    }
 
    public static void main(String[] args) {
        test1();//签名结果:9294d873d0f921bed24b6089708b66fbdfc4a6ea0eb30ad21e73ce603b82fbb7
        test2();//签名结果:fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659
    }
}

golang

package main
 
import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "net/url"
    "strings"
)
//使用时把sign方法拷贝到代码工程内即可
func sign(params url.Values, sk string) string {
    strEncode := params.Encode()
    strEncode = strings.Replace(strEncode, "+", "%20", -1)
    h := hmac.New(sha256.New, []byte(sk))
    h.Write([]byte(strEncode))
    return hex.EncodeToString(h.Sum(nil))
}
 
func main() {
    params := url.Values{}
    params.Add("Accesskey", "AKLTXQVF0pOmS6aahIrD5r0B3Q")
    params.Add("Service", "iam")
    params.Add("Action", "CreateUser")
    params.Add("Version", "2015-11-01")
    params.Add("Timestamp", "2021-08-12T02:47:36Z") //通过time.Now().UTC().Format("2006-01-02T15:04:05Z")实现
    params.Add("SignatureVersion", "1.0")
    params.Add("SignatureMethod", "HMAC-SHA256")
    params.Add("UserName", "Ttest")
    params.Add("RealName", "周四测试")
    params.Add("Email", "[email protected]")
    params.Add("Remark", "~ce shi*%#|+")
 
 
    sk := "OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw=="
    signature := sign(params, sk)
 
    fmt.Println(signature) // fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659
 
}

python3

import sys, os, base64, datetime, hashlib, hmac
import urllib.request
 
# 使用时把sign方法拷贝到代码工程内即可
def sign(params, secret_key):
    str_encode = ''
    param_keys = sorted(params.keys())
    for key in param_keys:
        str_encode += urllib.request.quote(key, '~') + '=' + urllib.request.quote(str(params[key]), '~') + '&'
 
    return hmac.new(bytes(secret_key, 'utf-8'), bytes(str_encode[:-1], 'utf-8'), hashlib.sha256).hexdigest()
 
arr = {
    'Accesskey' : 'AKLTXQVF0pOmS6aahIrD5r0B3Q',
    'Service' : 'iam',
    'Action' : 'CreateUser',
    'Version' : '2015-11-01',
    'Timestamp' : '2021-08-12T02:47:36Z', # 使用如下的方式产生UTC格式的时间,datetime.datetime.utcnow()
    'SignatureVersion' : '1.0',
    'SignatureMethod' : 'HMAC-SHA256',
    'UserName' : 'Ttest',
    'RealName' : '周四测试',
    'Email' : '[email protected]',
    'Remark' : '~ce shi*%#|+'
}
sk = 'OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw=='
signature = sign(arr, sk)
 
print(signature) #结果:fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659
文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈