我正在创建一个登录屏幕,并想将这些值与数据库中保存的值进行比较。出于安全原因,我对保存的密码进行了哈希处理,以致无法读取。
我遇到的问题是,数据库返回的值与数据库中保存的值不同。
保存的值??\u0013)??V\a!?=:???\u0016x\u0013??
返回值??\\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)??V\a!?=:???\u0016x\u0013??
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);
}
}
答案 0 :(得分:1)
我认为返回值是一个字符串。
在许多系统中,'\'
字符表示命令字符,例如: "\n"
换行。
要在字符串中显示'\'
字符,请将"\\"
放在字符串中。
我怀疑您的数据库字段是一个字符串,因此它将添加一个额外的'\'
字符,以便正确显示后面的Unicode字符代码。
想到两点:
确定要存储哈希密码吗?
通常,您比较散列/加密的密码值,而不进行任何反向转换。
修改
您是对的,已检查,Access似乎没有允许您存储二进制字段。散列密码将是二进制的,密码的存储是否会出现问题,例如能否在写入字段时自动添加'\'
字符?
尝试将哈希密码转换为十六进制的字符串表示形式,例如320A4F ...,存放之前。然后,您可以比较该字符串而不是哈希值。
SoapHexBinary
类可能会帮助您。