我正在制作一个登录屏幕,希望将这些值与数据库中保存的值进行比较。出于安全考虑,我对保存的密码进行了散列处理,使其无法读取。
我遇到的问题是,数据库的返回值与数据库中保存的值不相同。
保存值??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字符代码。
脑海中浮现两点:
-
您确定要存储哈希密码吗?
-
通常,您比较散列/加密的密码值,而不进行任何反向转换。
编辑
您是对的,检查后,Access似乎不允许您存储二进制字段。散列密码将是二进制的,密码的存储是否存在问题,例如Access在写入字段时自动添加''
字符?
尝试将散列密码转换为十六进制的字符串表示,例如320A4F。。。,储存前。然后,您可以比较该字符串,而不是散列值。
SoapHexBinary
课程可能会对你有所帮助。