Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 登录比较数据库中的哈希值_Sql_Sql Server_Sqlcommand_Scalar_Executenonquery - Fatal编程技术网

Sql 登录比较数据库中的哈希值

Sql 登录比较数据库中的哈希值,sql,sql-server,sqlcommand,scalar,executenonquery,Sql,Sql Server,Sqlcommand,Scalar,Executenonquery,我正在尝试创建一个应用程序的简单登录部分。要确认登录,我只是尝试确保输入的密码的哈希值与存储在本地数据库中的值匹配:App\u Users) 按钮单击: string AppUsername = textBox2.Text.ToString(); string AppPassword = textBox1.Text.ToString(); //- Hashed-V- byte[] salt; new RNGCrypt

我正在尝试创建一个应用程序的简单登录部分。要确认登录,我只是尝试确保输入的密码的哈希值与存储在本地数据库中的值匹配:App\u Users

按钮单击:

        string AppUsername = textBox2.Text.ToString();
        string AppPassword = textBox1.Text.ToString();
        //- Hashed-V-
        byte[] salt;
        new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
        var pbkdf2 = new Rfc2898DeriveBytes(AppPassword, salt, 10000);
        byte[] hash = pbkdf2.GetBytes(20);
        byte[] hashBytes = new byte[36];
        Array.Copy(salt, 0, hashBytes, 0, 16);
        Array.Copy(hash, 0, hashBytes, 16, 20);
        string savedPasswordHash = Convert.ToBase64String(hashBytes);                                                                   //              <--  see ' https://stackoverflow.com/questions/4181198/how-to-hash-a-password ' for the part on comparing the recalculated 
        //-
        SqlConnection con = new SqlConnection();
        con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
        con.Open();                

        var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE (Hash = @Hash");
        cmd.Connection = con;
        savedPasswordHash = cmd.ExecuteScalar() as string;

        if (cmd.ExecuteNonQuery() > 0) {
            MessageBox.Show(" Query successful..something matched..  ");
            //change page.. load a profile? 
        }

我到处找了找,但我不确定下一步我要做的到底是什么。。抱歉,这可能是个糟糕的问题,sql方面。我想这和适配器有关

您没有在查询中传递
@Hash
参数的值。您还应该在查询中检查用户名,否则,如果任何登录使用给定密码,则登录尝试将成功

尝试以下方法:

...
var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE Hash = @Hash AND Username = @Username");
cmd.Connection = con;
cmd.Parameters.Add("@Hash", SqlDbType.VarChar, 48).Value = savedPasswordHash;
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 32).Value = AppUsername;

if (cmd.ExecuteNonQuery() > 0) {
...

这假设
App\u用户.Hash
VARCHAR(48)
App\u用户
NVARCHAR(32)
。您可能需要更改它以匹配实际使用的数据类型。

如果您使用参数,实际上必须添加它们!明白我的错误了><谢谢!它不再抛出任何错误。但它仍然没有显示messageBox。有没有其他的技巧来确认它是否有效?(除ExecuteOnQuery外)
...
var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE Hash = @Hash AND Username = @Username");
cmd.Connection = con;
cmd.Parameters.Add("@Hash", SqlDbType.VarChar, 48).Value = savedPasswordHash;
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 32).Value = AppUsername;

if (cmd.ExecuteNonQuery() > 0) {
...