试图使hmac-sha256与Powershell for Canvas API一起工作

我被任命为创build一个过程的任务,在这个过程中,PowerShell脚本需要调用Canvas服务器,以便从这个问题范围之外的其他用途中获取数据。

我做的第一件事就是研究Canvas API是如何工作的。 我最终发现这篇文章包含了我认为应该了解的所有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) $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中,默认的转义序列使用反引号而不是反斜杠\

为了使parsing器识别转义序列不仅仅是一个反引号字符和字母n ,而是使用一个可扩展的string( "而不是' ):

 $message = "GET`n`n`n`nmycrazymessage`n`nFri, 18 Nov 2016 15:29:52 GMT`nmycrazysecret" 

除此之外,您的HMAC签名程序是正确的(正确输出Oexq8/ulAGxSIQXGDVqoXyqk5x+n9cMrc3avcTW9aZk=更改$message值后)