我在我的应用程序中使用PBKDF2来存储用户密码.在我的Users表中,我有一个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
在我的登录页面上,我需要检索此盐和密码.因为它们是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,_Salt,_Salt.Length); } else { // No user with this email exists Feedback.Text = "No user with this email exists,check for typos or register"; }
但我知道这是错误的事实. Reader中的其他方法只有一个参数是要检索的列的索引.
谢谢!
解决方法
到目前为止,将它直接转换为byte []对我有用.
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 } } } }