我被任命为创建一个流程的任务,在该流程中,PowerShell 脚本需要调用 Canvas 服务器,以便从中获取数据以用于超出此问题范围的其他用途。
我做的第一件事是研究 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')
}
}
这是我在 node 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)
$c=@()
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='
我不知道是否有可能产生相同的结果,但我要问的问题是,为什么它们不产生不同的结果? (按键也是一样的)
最佳答案
在 PowerShell 中,默认转义序列使用反引号 `
而不是反斜杠 \
。
为了让解析器将转义序列识别为不仅仅是反引号字 rune 字和字母 n
,请使用可扩展字符串("
而不是 '
):
$message = "GET`n`n`n`nmycrazymessage`n`nFri, 18 Nov 2016 15:29:52 GMT`nmycrazysecret"
除此之外,您的 HMAC 签名过程是正确的(它在更改 $message
值后正确输出 Oexq8/ulAGxSIQXGDVqoXyqk5x+n9cMrc3avcTW9aZk=
)
关于javascript - 尝试使 hmac-sha256 与适用于 Canvas API 的 Powershell 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40680882/