数据库返回值被更改

时间:2020-04-06 09:03:31

标签: c# ms-access

我正在创建一个登录屏幕,并想将这些值与数据库中保存的值进行比较。出于安全原因,我对保存的密码进行了哈希处理,以致无法读取。

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

保存的值??\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);
                }

            }

1 个答案:

答案 0 :(得分:1)

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

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

想到两点:

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

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

修改

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

尝试将哈希密码转换为十六进制的字符串表示形式,例如320A4F ...,存放之前。然后,您可以比较该字符串而不是哈希值。

SoapHexBinary类可能会帮助您。