2016-11-18 1 views
1

PowerShell 스크립트가 Canvas 서버를 호출하여 다른 용도로 사용하기 위해 데이터를 가져와야하는 프로세스를 만드는 작업에 임명되었습니다. 이 질문의 범위 밖입니다.Powershell for Canvas API를 사용하여 hmac-sha256을 작동 시키려고했습니다.

내가 한 첫 번째 작업은 Canvas API가 실제로 어떻게 작동하는지 연구하는 것입니다. 나는 결국이 점을 발견했다. post은 API에 대해 알아야 할 모든 것을 담고있다. API에는 HMAC SHA 256 해시가 필요합니다.

PowerShell에서 같은 스크립트를 만들기 위해 해시를 만드는 작성자 코드를 리버스 엔지니어링하기로 결정했습니다. 여기

내가 노드 JS 응용 프로그램에 넣어 매개 변수 내 약간 수정 코드 (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') 
    } 
} 

되어있다

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/

,536,913,632 : ulAGxSIQXGDVqoXyqk5x + n9cMrc3avcTW9aZk은 = '여기

내 PowerShell을 파일입니다 10
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

기본 이스케이프 시퀀스는 백 슬래시 \이 아닌 ` 백틱을 사용합니다. 보다

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

기타, 당신의 HMAC : 확장 문자열 (대신 '")를 사용하지 단지 리터럴 역 따옴표 문자와 문자 n로 이스케이프 시퀀스를 인식하는 파서 위해서는

서명 절차가 정확합니다 ($message 값을 변경 한 후에 정확하게 Oexq8/ulAGxSIQXGDVqoXyqk5x+n9cMrc3avcTW9aZk=을 출력 함)

관련 문제