javascript - 尝试使 hmac-sha256 与适用于 Canvas API 的 Powershell 一起使用

标签 javascript node.js powershell canvas

我被任命为创建一个流程的任务,在该流程中,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/

相关文章:

PowerShell 模块部署复制

node.js - 如何让 create-react-app 使用 IP 连接到我的 api 服务器?

powershell - 在 PowerShell 中创建对象数组作为类成员

javascript - jQuery:获取相关或接近的元素?

javascript - 在 IE 中打开的窗口不起作用

javascript - 即使在解析后,ConfigService仍返回字符串值

mysql - 在函数中使用 node-mysql

Azure Functions PowerShell - 从 Azure 存储表访问时间戳值

javascript - 如何在不使用ActiveX控件的情况下从应用程序中获取当前登录的用户名?

javascript - 将 null php 变量分配给 javascript