在测试项目中使用您的代码(带有文本框+按钮+标签的Windows窗体)我添加了这个:
internal class UserData { public byte[] Password { get; set; } public byte[] Salt { get; set; } } public string Connection { get; set; } private void UpdateData(string mail, string password) { // not a clue what to do here.... } private void button1_Click(object sender, EventArgs e) { var password = textBox1.Text; var u = HashPassword(password); var b = new SqlConnectionStringBuilder {DataSource = "127.0.0.1", IntegratedSecurity = true}; Connection = b.ConnectionString; InsertData("test@domain.com", password); label1.Text = string.Format("Using direct check: {0}\nVia the database: {1}", CheckPassword(password, u.Password, u.Salt), ValidateLogIn("test@domain.com", password)); }
并且它返回true;真正没有任何问题。 (VS2010,.Net4 CP,SQL2008R2)
在数据库中我使用了这个:
CREATE TABLE tempdb..t_hash ( Mail nvarchar(64) NOT NULL PRIMARY KEY (Mail), Hash varbinary(128), Salt varbinary(128) )
我最好的猜测是你对UserData clas的定义是“有缺陷的”?
用deroby的答案检查后仍然没有运气。我重新检查并实现了20个字节是120位,因此varbinary无法存储整个盐。将它增加到256后就可以了。