2016-03-15 41 views
-3

我生成的C#和Node.js的哈希字符串,但繼續得到兩種不同的結果...HMACSHA256在C#VS的node.js

在C#:

byte[] secretKeyBytes = Convert.FromBase64String('some_secret_key'); 
byte[] requestValuesSignature = Encoding.UTF8.GetBytes('teststring'); 
HMACSHA256 testHash = new HMACSHA256(secretKeyBytes); 

byte[] = hashedBytes = testHash.ComputeHash(requestValuesSignature); 
string hash1 = Convert.ToBAse64String(hashedBytes); 

Console.WriteLine(hash1); 

在Node.js的:

var hash2 = crypto.createHmac('SHA256', 'some_secret_key').update('teststring', 'utf8').digest('base64'); 

有人可以幫忙嗎?

在此先感謝!

+0

它可以幫助您提供結果,添加到問題中。 – zaph

回答

0

嘗試這種方式

byte[] secretKeyBytes = Encoding.UTF8.GetBytes('some_secret_key'); 

因爲JS實現不一樣的,它只是會從鑰匙串,這並不需要是一個base64字符串,但可以是任何字符串的字節數。

編輯:

正如你不能改變C#的一面,你必須做同樣的(可能是錯誤的)行爲上側的NodeJS,即它被用作祕密之前解碼的base64字符串。

var mykey = new Buffer('some_secret_key', 'base64').toString(); 
var hash2 = crypto.createHmac('SHA256', mykey).update('teststring', 'utf8').digest('base64'); 

要知道,雙方將失敗,如果祕密是不是一個有效的base64字符串

+0

我不能改變C#端的任何東西,因爲它是來自另一個團隊的代碼..我不得不改變node.js端的東西.. –

+1

@ user1547174最好添加其他信息,比如這個問題。 – zaph

-4

答案(這是不允許的!) - C#的一面,改變UTF8到ASCIIEncoding!

+1

首先,你說過,你不能在c#端改變任何東西?其次,這個答案顯然是錯誤的。 – derpirscher