C# 将二进制文件从表列读入字节[]数组

C# 将二进制文件从表列读入字节[]数组,c#,asp.net,arrays,sql-server,C#,Asp.net,Arrays,Sql Server,我在应用程序中使用PBKDF2来存储用户密码。在我的用户表中,我有一个Salt和Password列,如下所示: // Hash the users password using PBKDF2 var DeriveBytes = new Rfc2898DeriveBytes(_Password, 20); byte[] _Salt = DeriveBytes.Salt; byte[] _Key = DeriveBytes.GetBytes(20); // _Key is put into the

我在应用程序中使用PBKDF2来存储用户密码。在我的用户表中,我有一个
Salt
Password
列,如下所示:

// Hash the users password using PBKDF2
var DeriveBytes = new Rfc2898DeriveBytes(_Password, 20);
byte[] _Salt = DeriveBytes.Salt;
byte[] _Key = DeriveBytes.GetBytes(20);  // _Key is put into the Password column
在我的登录页面上,我需要检索这个salt和密码。因为它们是byte[]数组,所以我将它们作为
varbinary(MAX)
存储在表中。现在我需要检索它们以与用户输入的密码进行比较。我将如何使用
SqlDataReader
?目前,我有以下几点:

cn.Open();
SqlCommand Command = new SqlCommand("SELECT Salt, Password FROM Users WHERE Email = @Email", cn);
Command.Parameters.Add("@Email", SqlDbType.NVarChar).Value = _Email;
SqlDataReader Reader = Command.ExecuteReader(CommandBehavior.CloseConnection);
Reader.Read();
if (Reader.HasRows)
{
    // This user exists, check their password with the one entered
    byte[] _Salt = Reader.GetBytes(0, 0, _Salt, 0, _Salt.Length);
}
else
{
    // No user with this email exists
    Feedback.Text = "No user with this email exists, check for typos or register";
}

但我知道这是错误的。
Reader
中的其他方法只有一个参数是要检索的列的索引。

我不确定您为什么认为您编写的代码是错误的(请解释)。但特别针对错误:
请注意,返回的是
long
而不是字节数组

因此,您应该使用:
Reader.GetBytes(0,0,_Salt,0,_Salt.Length)



long bytesRead=Reader.GetBytes(0,0,_Salt,0,_Salt.Length)

到目前为止,直接将其转换为
字节[]
对我很有效

using (SqlConnection c = new SqlConnection("FOO"))
{
    c.Open();
    String sql = @"
        SELECT Salt, Password 
        FROM Users 
        WHERE (Email = @Email)";
    using (SqlCommand cmd = new SqlCommand(sql, c))
    {
        cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = _Email;
        using (SqlDataReader d = cmd.ExecuteReader())
        {
            if (d.Read())
            {
                byte[] salt = (byte[])d["Salt"];
                byte[] pass = (byte[])d["Password"];

                //Do stuff with salt and pass
            }
            else
            {
                // NO User with email exists
            }
        }
    }
}

你怎么知道它错了?因为你所做的正是所有其他相关问题所做的。你确定你创建的字节数组可以放入
varbyte
VS中吗?VS抛出一个错误,说它不能将long转换为byte[],并且参数描述与我输入的不匹配,比如
Salt.\u Length
。如果你查看该方法所需的参数,你会发现我的参数不正确,但我不知道该具体说明什么。而且我无法将其转换为long,它必须作为字节数组返回,以便我的密码检查工作。@JamesDawson请阅读GetBytes函数的说明(我在回答中发布了该说明):从指定的列偏移量将字节流读取到缓冲区,数组从给定的缓冲区偏移量开始。换句话说,在您的示例中,将把列号0的字节流复制到
\u Salt
变量中。这正是你想要的。(GetBytes函数的返回值只是读取的字节数,因此它是一个
长的
)。您是否按照我的建议更改了代码?它起作用了吗?