数据库返回值已更改



我正在制作一个登录屏幕,希望将这些值与数据库中保存的值进行比较。出于安全考虑,我对保存的密码进行了散列处理,使其无法读取。

我遇到的问题是,数据库的返回值与数据库中保存的值不相同。

保存值??u0013)??Va!?=:???u0016xu0013??

返回值??\u0013)??V\a!?=:???\u0016x\u0013??

正如您所看到的,斜杠在返回字符串中加倍。

我的问题是:代码在哪里将斜杠加倍?我如何才能停止这种情况?

提前感谢您的帮助!


private Tuple<bool, string> AskPassword(int zone)
{
PendingOrdersReadTableAdapters.PersoneelTableAdapter personeelTableAdapter = new PendingOrdersReadTableAdapters.PersoneelTableAdapter() { Connection = { ConnectionString = CppImport.returnConnectionString() } };
DataTable myData;
UserLogin userLogin = new UserLogin();
Start:
// Show testDialog as a modal dialog and determine if DialogResult = OK.
if (userLogin.ShowDialog(this) == DialogResult.OK)
{
string username = userLogin.getUser();
//get the data connected to this username
myData = personeelTableAdapter.GetByName(username);
int userSalt = Convert.ToInt32(myData.Rows[0]["Salt"]);
Password pwd = new Password(userLogin.getPassword(), userSalt);
// UsergivenPassword is ??u0013)??Va!?=:???u0016xu0013?? 
string userGivenPassword = pwd.ComputeSaltedHash();
// savedPassword is ??\u0013)??V\a!?=:???\u0016x\u0013?? 
var savedPassword = myData.Rows[0]["SaltedHash"];
if (userGivenPassword == savedPassword ) { return Tuple.Create(true, username); }
else { MessageBox.Show("Wachtwoord niet correct"); goto Start; }
}
else
{
userLogin.Dispose();
return Tuple.Create(false,string.Empty);
}
}

我认为返回的值是一个字符串。在许多系统中,''字符表示后面的命令字符,例如"n"表示换行符。

要在字符串中显示一个''字符,您需要在字符串中放置"\"。我怀疑您的数据库字段是一个字符串,因此它添加了一个额外的''字符,以便正确显示下面的Unicode字符代码。

脑海中浮现两点:

  1. 您确定要存储哈希密码吗?

  2. 通常,您比较散列/加密的密码值,而不进行任何反向转换。

编辑

您是对的,检查后,Access似乎不允许您存储二进制字段。散列密码将是二进制的,密码的存储是否存在问题,例如Access在写入字段时自动添加''字符?

尝试将散列密码转换为十六进制的字符串表示,例如320A4F。。。,储存前。然后,您可以比较该字符串,而不是散列值。

SoapHexBinary课程可能会对你有所帮助。

最新更新