如何在Postman里对参数进行SHA1WithRSA数字签名

如何在Postman里对请求参数进行数字签名

需求场景:最近做的一个支付网关项目,基于http协议接受请求参数,因此想到用postman来做联调和场景测试,postman的参数管理和请求分组编排比较方便。
但是请求需要做数字签名,也就是说要在发送请求之前对请求做加密签名处理。

问题所在

  1. postman自带的加密函数是cryptoJS,不能满足数字RSA-SHA1签名,即java里的SHA1WithRSA
  2. 因此需要接入第三方库,这里找到两个forge.js和jsrsasign.js
    • postman的接入方式
    • 签名代码的编写方式
  3. 要找到java里的SHA1WithRSA对应的js里加密签名的实现方式,这个地方很不好确认。SHA1WithRSA叫法是java里的,在jsrsasign里也叫SHA1WithRSA,
    但在forge里就是sha1,这里是一点点试验出来的。如果还不能解决,只能使用openssl加密,但学习曲线就比较麻烦了,这是万不得已之选。

postman的接入方式

postman似乎没有很好的接入第三方库的方式,postman自身设计很庞大了,几十兆的安装包和几百兆的运行内存,实际上就是一个node环境的ide了。但接入方式有限。
接入方式大概有两种:
1.将js文件内容设置为global变量,eval执行js,但是这种方案似乎会导致很卡,我没有尝试
2.提供一个可以访问到js的web地址,如将js文件放到一个nginx下面,通过postman 发送请求获取js,设置为gloable变量,然后eval
这里选择的第二种方案。可以看到,这两种方案本质上都是设置为全局变量,然后eval执行js,这就要求js得打包支持eval,如果js文件打包有问题,或者像jsrsasign
不提供打包成一个js文件的,就很难接入。

软件环境

  • postman:
  • nodeJS

引入步骤及相关代码

  1. 下载forge.js,地址forge.js
  2. 下载nginx,将forge.js放到html目录下(ng都是默认的设置)
  3. 打开postman,在pre-script里输入如下代码:
console.log(pm.globals.has("forgeJS"));
if(!pm.globals.has("forgeJS")){
        pm.sendRequest("http://127.0.0.1/forge.js", function (err, res) {
        if (err) {
            console.log(err);}
        else {
            pm.globals.set("forgeJS", res.text());}
})}
eval(pm.globals.get("forgeJS"));
// console.log(pm.globals.get("forgeJS"));
//注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的
const private_key = '-----BEGIN PRIVATE KEY-----\n' +
'此处填写你的密钥字符串' +
'-----END PRIVATE KEY-----'

var privKey = forge.pki.privateKeyFromPem(private_key);
const md = forge.md.sha1.create();//这里的sha1对应的java的SHA1WithRSA
let _buffer='这里填写需要加密的参数串';
md.update(_buffer,"utf8"); 
let sig = privKey.sign(md);
let erg = forge.util.encode64(sig); 
console.log("Signature is: "+erg);

其他问题记录

  • 这里出现过一个问题,我通过forge官方的打包教程,自己通过npm install了forge,自己打包,最后打的包有问题,eval一直不成功。后来是直接用github上他们
    自己提供的已打包好的forge.js才成功了。此处,替换前,需要删除错误的js文件全局变量,使用代码: pm.globals.unset("forgeJS");
  • 加密方式自己多尝试

相关资料

cryptoJS

forge.js

jsrsasign

nodejs或openssl

  • https://www.zhihu.com/question/43367849
    • RSA-SHA1 和 SHA1WithRSA 是不是一样的(我感觉是一样的)
    • crypto 模块不过是 OpenSSL 的 wrapper
    • 想知道 crypto 支持什么算法,就去看 OpenSSL 的文档, man openssl(所以crptoJS也是支持SHA1的?)

完整代码:

let param = request.data;
console.log(param);
let paramStr = "";
// param.time = (new Date()).getTime().toString();
param = objSort(param);
console.log(param)
for (let i in param) {
    if (i == "sign" || i == "sign_type") {
        continue;
    }
    paramStr += i+"="+param[i] +"&";
}
paramStr = paramStr.substring(0, paramStr.length - 1);
console.log(paramStr);
function objSort(obj)
{
    let keys = Object.keys(obj).sort();
    let arr = {};
    for (let i in keys) {
        arr[keys[i]] = obj[keys[i]];
    }
    return arr;
}

// pm.globals.unset("forgeJS");
console.log(pm.globals.has("forgeJS"));
if(!pm.globals.has("forgeJS")){
        pm.sendRequest("http://www.xxx.cn/forge.js", function (err, res) {
        if (err) {
            console.log(err);}
        else {
            pm.globals.set("forgeJS", res.text());}
})}
eval(pm.globals.get("forgeJS"));
// console.log(pm.globals.get("forgeJS"));
// eval(postman.getGlobalVariable("forgeJS"));

const private_key = '-----BEGIN PRIVATE KEY-----\n' +
'yourrivatekey' +
'-----END PRIVATE KEY-----'

// console.log(forge);
//encrypt text "plaintext"
var privKey = forge.pki.privateKeyFromPem(private_key);
const md = forge.md.sha1.create();
let _buffer='api_name=zhk.trade.query&app_auth_token=201603BBaf2dfb9a12954f09b7d356bd6b19bD26&biz_content={"inst_no":"18100001","mch_id":"1099219021210321","out_trade_no":"1543740545622","pay_type":"WECHAT"}&charset=UTF-8&service_name=yunzongxinxi&sign_type=RSA&timestamp=1458896291111&version=1.0';
md.update(paramStr,"utf8"); 
let sig = privKey.sign(md);
let erg = forge.util.encode64(sig); 
console.log("Signature is: "+erg);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容