嗨,我的问题是我已经在 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 函数接受一个字符串