2015-02-10 52 views
1

我試圖使用NodeJS加密庫和C#Rfc2898DeriveBytes生成相同的密碼哈希。在使用NodeJ生成的鹽時,C#實現不會生成相同的密鑰。我究竟做錯了什麼?在C#和NodeJS中生成相同的PBKDF2鍵

的鹽和散列中的NodeJS生成:

Salt: GJNw/wzXZxEdXrheqo322mf0x+92AeAuAHH48iiGZ+A= 
Hash: w6fCpsKxw78Fw4pMFk5Zw6vDin7CnG5VwpUWBSjCo8OSOTJ6w47Cv8KWcjIpwoA= 

在C#生成的哈希:

1G84mPkY78nsQ2BzO/qUPd+e0Lobrz7ZLzc+p7Zh0o8= 

我的C#測試代碼如下:

public const int HASH_BYTE_SIZE = 32; 
public const int PBKDF2_ITERATIONS = 1000; 

public static string HashPassword(string password, string salt) 
     { 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
      byte[] saltBytes = Convert.FromBase64String(salt); 

      var pbkdf2 = new Rfc2898DeriveBytes(passwordBytes, saltBytes, PBKDF2_ITERATIONS); 
      var hash = pbkdf2.GetBytes(HASH_BYTE_SIZE); 

      return Convert.ToBase64String(hash); 
     } 

static void Main(string[] args) 
     { 
      string salt = "GJNw/wzXZxEdXrheqo322mf0x+92AeAuAHH48iiGZ+A="; 
      string plainTextPsw = "12345"; 

      string hashedPsw = PasswordHash.HashPassword(plainTextPsw, salt); 

      Console.WriteLine(hashedPsw); 
      Console.ReadLine(); 
     } 

和的NodeJS:

var crypto = require('crypto'); 
var iterations = 1000; 
var bytes = 32; 

exports.createSalt = function() { 
    return new Buffer(crypto.randomBytes(bytes)).toString('base64'); 
} 

exports.hash = function hash(text, salt, callback) { 
    crypto.pbkdf2(text, salt, iterations, bytes, function (err, derivedKey) { 
     if (err) { callback(err); } 
     else { 
      var h = new Buffer(derivedKey).toString('base64'); 
      callback(null, h); 
     } 
    }); 
} 
+0

包含C#版本的結果。 – erickson 2015-02-11 00:29:41

+0

當然,C#生成:1G84mPkY78nsQ2BzO/qUPd + e0Lobrz7ZLzc + p7Zh0o8 = – squiso 2015-02-11 06:56:13

+0

請參閱我的解決方案的更新答案。 – erickson 2015-02-11 18:59:50

回答

0

在Node.js代碼中發生了一些錯誤轉換,導致產生無效結果。首先,傳遞給pbkdf2函數的「salt」應該是隨機字節,而不應用任何轉換。但是,在這種情況下,字節使用Base64編碼爲文本,並且該文本中的字符被Node.js用作鹽。

然後,導出的密鑰應該直接用Base64編碼爲文本。但在這裏,密鑰的字節被視爲字符;使用UTF-8編碼將此字符串轉換爲不同字節的新字符串。然後使用Base64編碼該編碼以產生最終的,不正確的結果。

+0

好的。 w6fCpsKxw78Fw4pMFk5Zw6vDin7CnG5VwpUWBSjCo8OSOTJ6w47Cv8KWcjIpwoDCgcK9wo8EeSldK0N1w6PDh8KwNGdgKzM2SsOHwqtewpo2aDt9w6QOXMKCw47CksKBwrLCrVAKB17DhzDCoHgbw4hywqPDpTdew5jCqMKUV2Nnw4TDr8KvwqnCmMKew75 + fzV6Ok/DuATDjk4hP8KqB8KfbxXDl1HDvzVMw7YFwqRyQDLDk8OvTDkEIE7ChcKES8KFw7BZG3RDw5DDuUPDo8Kqe28MWV5oGzPDs8KEDsODwqzCi8KDw6vCrMKOLsKFwqjDqMO2IsO5Gz07GsOqwo1LTCbCpcOSwrfCtWTDi8O4w6XDmcOpw50gw7IBU17DncOtw7IpVsK/w6tJJjbCgsKTwrbCoMOHwqU3wrZ + GMKXw5hQI8Kpw45rw5TDihfDmcO9M2BpOcKHFA3DmnHCjcKcDcO6wrHCjsOMwrsqwrjChTpaaXfDlcOMSX4 =:所以我用的256密鑰長度的輸出是再次嘗試 – squiso 2015-02-11 08:04:31

相關問題