繁体   English   中英

C#和JavaScript之间的pbkdf2计算不一致

[英]pbkdf2 computation not consistent between C# and JavaScript

嗨,我的问题是我已经在Windows Azure服务器端Javascript上用crypto.pbkdf2加密了密码我很确定有一个可以查询的公共库。 问题是我试图在系统上的C#中加密相同的密码,因为我希望凭据具有通用性,但是尽管使用Rfc2898DeriveBytes,并且盐第一次生成却无法返回相同的哈希密码。

谢谢您的帮助 :)

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);
    }
  });
}

和C#代码:

byte[] salt = Convert.FromBase64String(user.salt);
using (var deriveBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(password, salt, 1000))
{
  byte[] newKey = deriveBytes.GetBytes(32);

  // user is the user object drawn from the database in existence
  if (Convert.ToBase64String(newKey).Equals(user.password))
  {
    FormsAuthentication.RedirectFromLoginPage(Request.Form["username"], false);
  }
}

C#生成的十六进制= 3lRSQF5ImYlQg20CGFy2iGUpWfdP5TD0eq2cTHhLono =

JS生成的十六进制= w4PDh8K6YMKGwr3DgcObRsOsFFUgDMOJw5PCnkdAwrTCgcOOV8OCKMKFdcKRwrLCqMK2VA ==

JS生成并同时用于两个位置的盐= / Ij0hgDsvAC1DevM7xkdGUVlozdCxXVd0lgfK2xEh2A =

以上所有信息均为base64格式

另一件事可能有用

item.salt = new Buffer(crypto.randomBytes(bytes)).toString('base64'); crypto.pbkdf2(text, salt, iterations, bytes, function(err, derivedKey){

这意味着JS函数接受一个字符串

我希望凭据是通用的,但是尽管使用了Rfc2898DeriveBytes,并且盐第一次生成了,但我仍无法返回相同的哈希密码。

显而易见的东西是哈希算法,盐和迭代计数。 您可以确认(针对两种语言):

  1. 哈希算法
  2. 迭代次数

不明显的是密码的编码,也可能是盐。 我加入了盐,因为它通常以字符串形式存储。

为了使它在各种语言之间可移植,应该使用UTF-8。 这是因为您可能会遇到默认编码,UTF16-BE,UTF16-LE或任何其他数量的编码。

在C#中,设置为:

byte[] utf8_salt = Encoding.UTF8.GetBytes(salt);
byte[] utf8_pass = Encoding.UTF8.GetBytes(password);

然后,您将utf8_saltutf8_pass传递给PBKDF2函数。

我不知道如何在Javascript中执行相同的操作。

好的,孩子爸爸已经解决了..花了足够长的时间..

Buffer(encodedPassword, 'binary').toString('base64')

在Java脚本方面,现在我看过的教程显然不够准确。“二进制”丢失了。

谢谢大家的帮助:)

新年快乐

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM