我被任命为制作一个过程的任务,在这个过程中,PowerShell脚本需要调用Canvas服务器以便从其中获取数据以用于其他用途,这个问题的范围之外。试图让hmac-sha256与Powershell for Canvas API配合使用
我做的第一件事就是研究Canvas API的实际工作方式。我最终发现这个post拥有我认为我应该了解的API的一切。该API需要HMAC SHA 256哈希。
我已经决定对他的作者代码进行反向工程,使得哈希为了在PowerShell中创建相同的脚本。
这里是我稍微编辑的代码(node.js的)
var crypto = require('crypto')
var url = require('url')
var HMAC_ALG = 'sha256'
var apiAuth = module.exports = {
buildMessage: function(secret, timestamp, uri) {
var urlInfo = url.parse(uri, false);
var query = urlInfo.query ? urlInfo.query.split('&').sort().join('&') : '';
var parts = [ 'GET', urlInfo.host, '', '', urlInfo.pathname, query, timestamp, secret ]
console.log(parts);
return parts.join('\n');
},
buildHmacSig: function(secret, timestamp, reqOpts,message) {
//var message = apiAuth.buildMessage(secret, timestamp, reqOpts);
var hmac = crypto.createHmac(HMAC_ALG, new Buffer(secret))
hmac.update(message)
Console.log(message);
return hmac.digest('base64')
}
}
这里是我放在节点JS应用程序的参数
var canvas = require('[filepath]/new_canvas');
var secret = 'mycrazysecret';
var today = new Date();
var timestamp= today.toUTCString();
var regOpts = 'mycrazymessage';
var message = canvas.buildMessage(secret, timestamp, regOpts)
var hmac = canvas.buildHmacSig(secret, timestamp, regOpts,message);
最终代码就这个 “Oexq8/ulAGxSIQXGDVqoXyqk5x + n9cMrc3avcTW9aZk =”
这里是我的PowerShell文件:
function buffer
{
param ($string)
[email protected]()
Foreach ($element in $string.toCharArray()) {$c+= [System.Convert]::ToSByte($element)}
return $c
}
$message = 'GET\n\n\n\nmycrazymessage\n\nFri, 18 Nov 2016 15:29:52 GMT\nmycrazysecret'
$secret = 'mycrazysecret'
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = buffer -string $secret
$signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($message))
$signature = [Convert]::ToBase64String($signature)
echo $signature
最终的结果是“pF92zam81wclnnb8csDsscsSYNQ7it9qLrcJkRTi5rM =”
我不知道得到产生相同的结果,甚至有可能,但我问这个问题他们为什么不产生不同的结果? (密钥也一样)
在节点js示例中,时间戳是一个变量,在PowerShell文件中它是一个字符串。这可能会影响结果散列吗? –