跳至主要內容

签名生成


相关信息

VMP 要求客户端对请求进行签名。VMP 会在收到请求后进行签名的验证。

开发人员可以按照下述步骤生成请求的签名。

准备

客户端需要准备一组 user_confirm_keysecret_code,可以通过以下方式获取:

  • 发送邮件到对接联系人邮箱

构造签名串

假设请求参数

{
	"p0": "c",
	"p2": "b",
	"p1": "a"
}

假设 secret_code

testsignkey1234

第一步,按照参数名ASCII字典序排序。

{
	"p0": "c",
	"p1": "a",
	"p2": "b"
}

第二步,对参数按照key=value的格式,使用 & 符号连接生成字符串。

p0=c&p1=a&p2=b

第三步,secret_code 不用 & 符号连接,拼接在上一步生成的字符串开头组成签名串。

testsignkey1234p0=c&p1=a&p2=b

计算签名值

对签名串进行sha-256签名得到签名值,编码格式UTF-8

sha256('testsignkey1234p0=c&p1=a&p2=b', 'UTF-8');

签名结果

ed473ec9e423747a40b87403aa9814030861932d514dab000ed1f8a741f1d6df

构造完整的请求参数

把签名值添加到请求参数中,组成完整的请求参数。

{
	"p0": "c",
	"p2": "b",
	"p1": "a",
    "sign": "ed473ec9e423747a40b87403aa9814030861932d514dab000ed1f8a741f1d6df"
}

演示代码

import net.sf.json.JSONObject;
import org.junit.Assert;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class SignTest {

    @Test
    public void doSign() throws Exception {

        JSONObject requestParams = new JSONObject();
        requestParams.put("p0", "c");
        requestParams.put("p2", "b");
        requestParams.put("p1", "a");

        String secretCode = "testsignkey1234";

        String asciiLinkString = createAsciiLinkString(requestParams);
        System.out.println(asciiLinkString);

        String signTempString = secretCode + asciiLinkString;
        System.out.println(signTempString);

        String signCode = sha256(signTempString, "UTF-8");
        System.out.println(signCode);

        requestParams.put("sign", signCode);
        
    }

    private String createAsciiLinkString(JSONObject params) {
        List<String> keys = new ArrayList();
        keys.addAll(params.keySet());
        Collections.sort(keys);

        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < keys.size(); i++) {
            stringBuffer.append(keys.get(i)).append("=").append(params.get(keys.get(i)));
            if (i != keys.size() - 1) {
                stringBuffer.append("&");
            }
        }
        return stringBuffer.toString();
    }

    private String sha256(String signTempString, String charset)
            throws UnsupportedEncodingException, NoSuchAlgorithmException {
        byte[] bt = signTempString.getBytes(charset);
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(bt);
        byte[] r = md.digest();
        return bytes2Hex(r);
    }

    private String bytes2Hex(byte[] bts) {
        String des = "";
        for (int i = 0; i < bts.length; i++) {
            String tmp = (Integer.toHexString(bts[i] & 0xFF));
            if (tmp.length() == 1) {
                des += "0";
            }
            des += tmp;
        }
        return des;
    }

}

签名检验工具

请点击此处打开open in new window