RSA签名方法

此文档说明RSA256的签名方式,我们也支持MD5的签名方式。 为了方便大家验证签名,我们提供了RSA验证签名工具,下载链接如下: Windows版本验证签名工具 MAC OSX版本验证签名工具

RSA签名规则

  1. 构造待签名字符串。待签名字符的生成规则如下:
    1. 所有发送到后端的请求参数均加入签名,除了sign字端
    2. 所有参与签名的请求参数都按照名称字符升序排列(参数名称不允许相同)
    3. 如果参数值带有中文, 需要制定字符集编码为UTF-8
    4. 如果参数值为空,那么该参数不参与签名
    5. 将请求参数用`&`拼接起来(按照名称字符升序排列)
  2. 用算法RSA256,对待签名字符串进行加密, 生成的签名数据, 就是公共参数中sign的值。

签名示例

大家可以根据这个示例,来验证自己的签名结果是否正确。

现有如下参数参与签名:

参数名 参数值
barcode 123123123123
local_order_no localorderno123123123123
app zyptestapp
operator_id axgdfdafd34124
amount 100
un_discount_amount
timestamp 1460512556270
subject 这是一笔支付订单
goods_list

那么生成的待签名字符串为(合作秘钥的值设为:thisistestkey):

amount=100&app=zyptestapp&barcode=123123123123&local_order_no=localorderno123123123123&operator_id=axgdfdafd34124&subject=这是一笔支付订单&timestamp=1460512556270

注:因为un_discount_amountgoods_list两个参数的值为空,所以没有参与签名

签名结果为:

DZl5E2lshdttk8ANeKjmzTcuoEMMF8PMUXKZW3/ljqYJcQXzqQNa0VOSJVxIu59MMFs1RmAMOP0ZyeA4FMB8kEHJuy9kPEFdX71zrNGn7WP5k621Tc8ObMUYn7Qe72KS1SV3iu6WFvQ2hDtiC0xpvwxuLOHwlJvfZBY33/6fh560hWwZ79w2OgLnRz96eJhOsPh5QOUKGkPqRzrnM/XbbXabfKJif5Zs1FS8/40dufRCXhtqujKMdqjSmX7i3RnHyy26ZLRebgClWQvzMqzfKH6xIy5MauZeuLBiM8WYaHFK+5WdXEJj5HLW1DtSDIp9tgzDuyhwh0N2EqTJ1qTfVQ==

Rsa签名方法示例(java)

/**
 * 使用Rsa算法进行加密
 *
 * @param target
 *            要加密的字符串
 * @param charset
 *            编码(请设置为UTF-8)
 * @return 加密后的字符串
 */
public static String rsa256Sign(String content, String privateKey, String charset) throws RsaSignException {
        try {
            PrivateKey e = getPrivateKeyFromPKCS8("RSA", new ByteArrayInputStream(privateKey.getBytes()));
            Signature signature = Signature.getInstance("SHA256WithRSA");
            signature.initSign(e);
            if (StringUtils.isEmpty(charset)) {
                signature.update(content.getBytes());
            } else {
                signature.update(content.getBytes(charset));
            }

            byte[] signed = signature.sign();
            return new String(Base64.encodeBase64(signed));
        } catch (Exception var6) {
            throw new RsaSignException("RSAcontent = " + content + "; charset = " + charset, var6);
        }
    }

    public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, InputStream ins) throws Exception {
        if (ins != null && !StringUtils.isEmpty(algorithm)) {
            KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
            byte[] encodedKey = StreamUtil.readText(ins).getBytes();
            encodedKey = Base64.decodeBase64(encodedKey);
            return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
        } else {
            return null;
        }
    }

生成签名串并签名的方法示例

/**
 * 对params中的参数进行排序后生成签名串
 * @param params 参与签名的参数map
 * @param key 签名要用到的加密串
 * @return
 */
String sign=null;
    StringBuffer sb = new StringBuffer();
    //排序
    List<Map.Entry<String, String>> infoIds =
            new ArrayList<Map.Entry<String, String>>(params.entrySet());
    Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
        public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
            return (o1.getKey()).toString().compareTo(o2.getKey());
        }
    });
    //对参数数组进行按key升序排列,然后拼接,最后调用5签名方法
    int size  = infoIds.size();
    for(int i = 0; i < size; i++) {
        if(StringUtils.isNotEmpty(infoIds.get(i).getValue())) {//不为空,为空的不参与签名
            sb.append(infoIds.get(i).getKey() + "=" + infoIds.get(i).getValue() + "&");
        }
    }
    String newStrTemp = sb.toString()+"key="+key.trim();
    //获取sign_method

    sign = EncryptionUtil.rsa256Sign(newStrTemp,YOUR_PRIVATE_KEY,"UTF-8");

    return sign;

results matching ""

    No results matching ""