我正在建立一个网站,他们当前的登录系统是在C#中。我正在用PHP构建网站,并希望为他们的客户保持相同的密码。为了做到这一点,我需要使他们的散列函数与我的相同。因为我对C#了解不多,所以我遇到了一些麻烦。
以下是我发现的C#函数,它们在我反编译代码时设置密码很有用:
string salt = ui.UserGUID.ToString();
if (!string.IsNullOrEmpty(UserInfoProvider.UserSaltColumn))
salt = ui.GetStringValue(UserInfoProvider.UserSaltColumn, string.Empty);
ui.SetValue("UserPassword", (object) UserInfoProvider.GetPasswordHash(userPassword, stringValue, salt));
GetPasswordHash函数将返回:
return SecurityHelper.GetSHA2Hash(password + salt + UserInfoProvider.PasswordSalt);
GetSHA2Hash功能是我认为我的问题所在。这是函数的一行代码:
return ValidationHelper.GetStringFromHash(new SHA256Managed().ComputeHash(Encoding.Default.GetBytes(inputData)));
最后,这是GetStringFromHash函数:
StringBuilder stringBuilder = new StringBuilder();
foreach (byte hashByte in hashBytes)
stringBuilder.Append(string.Format("{0:x2}", (object) hashByte));
return stringBuilder.ToString();
在第一个代码中,stringValue是sha256,它会像代码一样拉出第二个代码。 salt存储在数据库中,因此我知道该值是什么,并且我知道要加密的非加密密码。在第二段代码中,“salt”变量为null,因此它只对数据库中的密码和salt进行哈希处理。
我尝试了几个不同的PHP代码试图让密码匹配,但到目前为止还没有。以下是我尝试过的一些事情:
$hash = hash('sha256', ord("Password" . "The Salt"));
$hash = hash('sha256', "Password" . "The Salt");
$hash = (hash('sha256', mb_convert_encoding("Password" . "The Salt","UTF-8"), true));
我知道最后一段代码是将字符串格式化为十六进制,但我现在不知所措。我希望这是一个简单的解决方案。昨天我花了大部分时间追踪所有功能,并试图让它在将它带到这里之前工作。
提前致谢。
解决。显然,GUID在第一行被低估了:
string salt = ui.UserGUID.ToString();
这导致问题出错。我创建了一个在线小提琴,当我得到与PHP相同的输出时,我知道有些东西正在被改变。再看一下然后我们发现了问题。这是最终的PHP,以防止未来的人:
$hash = hash('sha256', "Password" . strtolower("The Salt"));