[英]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,并且盐第一次生成了,但我仍无法返回相同的哈希密码。
显而易见的东西是哈希算法,盐和迭代计数。 您可以确认(针对两种语言):
不明显的是密码的编码,也可能是盐。 我加入了盐,因为它通常以字符串形式存储。
为了使它在各种语言之间可移植,应该使用UTF-8。 这是因为您可能会遇到默认编码,UTF16-BE,UTF16-LE或任何其他数量的编码。
在C#中,设置为:
byte[] utf8_salt = Encoding.UTF8.GetBytes(salt);
byte[] utf8_pass = Encoding.UTF8.GetBytes(password);
然后,您将utf8_salt
和utf8_pass
传递给PBKDF2
函数。
我不知道如何在Javascript中执行相同的操作。
好的,孩子爸爸已经解决了..花了足够长的时间..
Buffer(encodedPassword, 'binary').toString('base64')
在Java脚本方面,现在我看过的教程显然不够准确。“二进制”丢失了。
谢谢大家的帮助:)
新年快乐
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.