2016-11-18 71 views
1

我被任命为制作一个过程的任务,在这个过程中,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 =”

我不知道得到产生相同的结果,甚至有可能,但我问这个问题他们为什么不产生不同的结果? (密钥也一样)

+0

在节点js示例中,时间戳是一个变量,在PowerShell文件中它是一个字符串。这可能会影响结果散列吗? –

回答

3

在PowerShell中,默认转义序列使用反引号`而不是反斜杠\

为了让解析器承认转义序列并不只是一反引号字符文字和字母n,使用可扩展字符串("而不是'):

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

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