【发布时间】:2016-09-16 23:16:17
【问题描述】:
我正在尝试使用 Postman 发送一个 GET http 请求,其中包含一个参数,该参数是通过获取完整的请求查询字符串(URL 中问号右侧的所有内容,在 URL 编码之后)动态生成的,连接之前分配的共享密钥,然后对结果字符串执行 SHA-1 哈希。
我会使用预请求脚本来实现这一点。
谢谢。
【问题讨论】:
标签: javascript security sha postman
我正在尝试使用 Postman 发送一个 GET http 请求,其中包含一个参数,该参数是通过获取完整的请求查询字符串(URL 中问号右侧的所有内容,在 URL 编码之后)动态生成的,连接之前分配的共享密钥,然后对结果字符串执行 SHA-1 哈希。
我会使用预请求脚本来实现这一点。
谢谢。
【问题讨论】:
标签: javascript security sha postman
我实际上找到了一个解决方案并想分享它。
var params = [
["client_id", "222"]
,["account_id", ""]
];
// Build the request body string from the Postman request.data object
var requestBody = "";
var firstpass = true;
for(var i=0;i < params.length; i++) {
if(!firstpass){
requestBody += "&";
}
requestBody += params[i][0] + "=" + params[i][1];
firstpass = false;
postman.setGlobalVariable(params[i][0], params[i][1]);
}
requestBody += postman.getEnvironmentVariable("sharedSecretKey");
postman.setGlobalVariable("requestBody", requestBody);
var mac = "";
if(requestBody){
// SHA1 hash
mac = CryptoJS.SHA1(requestBody);
}
postman.setGlobalVariable("mac", mac);
然后我只需要在 URL 中设置参数: {{baseUrl}}/get?client_id={{client_id}}&account_id={{account_id}}&mac={{mac}}
其中 {{baseUrl}} 是环境变量 和 {{client_id}}、{{account_id}} 是全局变量
希望它对某人有所帮助。
谢谢。
【讨论】:
受this answer 的启发,我使用以下 Postman 预请求脚本来创建请求的 SHA1 哈希。
注意request.data 是一个隐含变量,CryptoJS 库由Postman Sandbox for pre-request scripts 提供。
const hash = CryptoJS.HmacSHA1(request.data, 'yourSecret').toString();
pm.globals.set('hash', hash);
您现在可以使用{{hash}} 语法将哈希值作为邮递员全局变量引用。
我的目的是模拟GitHub Webhooks API 提供的X-Hub-Signature 标头,因为我的Web 服务会验证所有Webhook 有效负载以匹配签名。所以为了测试我的网络服务,我还需要邮递员来生成一个有效的签名头。
这是对上述代码 sn-p 的改编,用于生成 X-Hub-Signature 请求标头值。
GITHUB_WEBHOOK_SECRET 以及我在创建 GitHub 应用程序时指定的值。const hash = CryptoJS.HmacSHA1(
request.data,
pm.environment.get('GITHUB_WEBHOOK_SECRET')
).toString();
pm.globals.set('X-HUB-SIGNATURE', 'sha1=' + hash);
【讨论】:
.toString()