通过邮递员进行HMAC身份验证

时间:2018-07-23 09:43:56

标签: c# security postman hmac

我使用一个示例来为Web API项目设置HMAC身份验证。原始示例源代码/项目可在此处找到:

http://bitoftech.net/2014/12/15/secure-asp-net-web-api-using-api-key-authentication-hmac-authentication/

我正在尝试让邮递员在其预请求脚本中构造并发送GET请求。但是,请求始终以401失败,我不知道为什么。
邮递员的预请求脚本:

var AppId = "4d53bce03ec34c0a911182d4c228ee6c";
var APIKey = "A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=";
var requestURI = "http%3a%2f%2flocalhost%3a55441%2fapi%2fv1%2fdata";
var requestMethod = "GET";
var requestTimeStamp = "{{$timestamp}}";
var nonce = "1";
var requestContentBase64String = "";

var signatureRawData  = AppId + requestMethod + requestURI + requestTimeStamp +  nonce + requestContentBase64String; //check
var signature = CryptoJS.enc.Utf8.parse(signatureRawData);
var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);
var signatureBytes = CryptoJS.HmacSHA256(signature,secretByteArray)

var requestSignatureBase64String = CryptoJS.enc.Base64.stringify(signatureBytes);
postman.setGlobalVariable("key", "amx " + AppId + ":" + requestSignatureBase64String + ":" + nonce + ":" + requestTimeStamp);

2 个答案:

答案 0 :(得分:1)

经过几天的测试,我发现了问题所在。实际上,这与Postman提供的所有内容的可变占位符有关。在测试占位符{{$ timestamp}}时,其面值正在传递有效值。当我剥离签名以仅从一个段开始时,我就成功获得了身份验证。直到我当然放回时间戳占位符。

当我用占位符替换标题中传递的实际值时,它可以正常工作。我只能得出结论,必须有一些看不见的额外字符。也许在邮递员创建签名时。该问题扩展到其他占位符,例如{{$ guid}}。

答案 1 :(得分:1)

这是我在预脚本中使用的代码。它适用于任何查询GET,PUT,POST,DELETE。

您需要更改AppId和APIKey值,并在最后一行调整环境变量“ hmacKey”的名称。

var uuid = require('uuid');
var moment = require("moment")

var AppId = "4d53bce03ec34c0a911182d4c228ee6c";
var APIKey = "A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=";
var requestURI = encodeURIComponent(pm.environment.values.substitute(pm.request.url, null, false).getRaw()).toLowerCase();
var requestMethod = pm.request.method;
var requestTimeStamp = moment(new Date().toUTCString()).valueOf() / 1000;
var nonce = uuid.v4();
var requestContentBase64String = "";

if (pm.request.body) {
    var md5 = CryptoJS.MD5(pm.request.body.toString());
    requestContentBase64String = CryptoJS.enc.Base64.stringify(md5);
}

var signatureRawData  = AppId + requestMethod + requestURI + requestTimeStamp +  nonce + requestContentBase64String; //check
var signature = CryptoJS.enc.Utf8.parse(signatureRawData);
var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);
var signatureBytes = CryptoJS.HmacSHA256(signature,secretByteArray);
var requestSignatureBase64String = CryptoJS.enc.Base64.stringify(signatureBytes);

var hmacKey = "amx " + AppId + ":" + requestSignatureBase64String + ":" + nonce + ":" + requestTimeStamp;
postman.setEnvironmentVariable("hmacKey", hmacKey);