2017-06-17 129 views
-2

我想跟隨用PHP編寫的API的教程的一部分。它們顯示出以下例子:NodeJS HMAC哈希創建

$public = 'JkAFq7M47kLN0xVD'; 
$private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB'; 

$url = 'https://pterodactyl.local/api/admin/users'; 
$body = ''; 

$hmac = hash_hmac('sha256', $url . $body, $private, true); 

return $public . '.' . base64_encode($hmac); 

// Should return the string below: 
// 
// JkAFq7M47kLN0xVD.wgIxj+V8RHgIetcQg2lRM0PRSH/y5M21cPz9zVhfFaQ= 

但我的方法不返回正確的值。相反,它返回如下:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo= 

這裏是我的代碼:

hmac = crypto.createHmac('sha256', private_key); 
    hmac.write(url+body); 
    hmac.end(); 
    hash = hmac.read().toString('base64'); 
    console.log(hash); 

編輯:我認爲,他們所提供的例子是無效的,因爲大家都在說我的代碼幾乎是相同的,PHP代碼輸出一個不同的值,然後它說它應該在文檔中。

+0

*「應該返回下面的字符串」* - 嗯,它不。你的PHP代碼和你的node.js代碼目前是相同的。也許你應該檢查你的PHP代碼是否確實在運行你的想法。 –

+0

這不是公鑰密碼的工作原理。 HMAC是一個對稱組件。 –

+0

@ ArtjomB.how這不是公鑰密碼的工作原理嗎? –

回答

1

確定,所以,我用這個工具writephponline運行此PHP代碼:

$public = 'JkAFq7M47kLN0xVD'; 
$private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB'; 

$url = 'https://pterodactyl.local/api/admin/users'; 
$body = ''; 

$hmac = hash_hmac('sha256', $url . $body, $private, true); 

echo $public . '.' . base64_encode($hmac); 

和回報:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo= 

所以我用的是作爲一個參數,然後我做了一個小的NodeJS腳本:

var crypto = require('crypto'); 

var public = 'JkAFq7M47kLN0xVD'; 

var private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB'; 

var url = 'https://pterodactyl.local/api/admin/users'; 

var body = ''; 

var hmac = crypto.createHmac('sha256', private).update(url+body).digest('base64'); 

console.log(public + '.' + hmac); 

和回報:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo= 

希望它有幫助。

1

我寧願使用加密標準庫crypto-js。這個庫正在保持。

const crypto = require('crypto-js') 

const public = 'JkAFq7M47kLN0xVD' 
const private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB' 
const url = 'https://pterodactyl.local/api/admin/users' 
const body = '' 

const hmac = crypto.HmacSHA256(url + body, private).toString(crypto.enc.Base64) 

console.log(public + '.' + hmac) 
// Print value: 
// JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo= 
+0

我使用的是由NodeJS的衆神自己構建和維護的。 –