也许我只是没有使用Google搜索正确的参数,但我似乎无法想出这个参数 我创建了一个哈希密码,根据我的理解,它应该是一个字节数组。 然后我需要将它插入到SqlDataSource中,这就是我的问题所在。
我的数据库定义如下;
**Column** || **Data Type** ---------------------------- Name || varchar(50) Username || varchar(50) HashedPwd || varbinary(50) Salt || varbinary(50) UserType || varchar(50)
我的代码如下;
HashAlgorithm hashing = new SHA256Managed();
byte[] passwordPlainText = (new System.Text.ASCIIEncoding()).GetBytes(txtPassword.ToString());
byte[] salt = (new System.Text.ASCIIEncoding()).GetBytes(RNGCryptoServiceProvider.Create().ToString());
// Combine salt and password before hashing.
byte[] saltAndPwd = new byte[passwordPlainText.Length + salt.Length];
Array.Copy(passwordPlainText, saltAndPwd, passwordPlainText.Length);
Array.Copy(salt, 0, saltAndPwd, passwordPlainText.Length, salt.Length);
byte[] hashedPwd = hashing.ComputeHash(saltAndPwd);
database.InsertCommandType = SqlDataSourceCommandType.Text;
database.InsertCommand = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, Type) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);";
database.InsertParameters.Add("insName", txtName.Text);
database.InsertParameters.Add("insUsername", txtUsername.Text);
database.InsertParameters.Add("insHashedPass", (new System.Text.ASCIIEncoding()).GetString(hashedPwd));
database.InsertParameters.Add("insSalt", (new System.Text.ASCIIEncoding()).GetString(salt));
database.InsertParameters.Add("insType", txtType.Text);
database.Insert();
数据库的内容是我从互联网上的研究中收集到的东西,看看我在Visual Studio中使用方便的自动完成功能给出了哪些选项。
仅供参考我使用的是Visual Studio 2010版本10.0.4,.Net版本4.0.3
似乎有一些用于SQL连接的外部库,但我更愿意使用.Net提供的内置函数。
目前,我在运行插入算法时收到此错误;
不允许从数据类型nvarchar到varbinary的隐式转换。使用CONVERT函数运行此查询。
我不确定如何使用转换功能
Add()方法可以采用字符串,字符串就像我正在做的那样,或者也可以采用字符串,DbType,字符串。我试过database.InsertParameters.Add("insSalt", DbType.Binary, salt);
,但我甚至无法编译/构建网站。我明白了“无法从byte []转换为String”
如果我将其更改为salt.ToString()
我得到; “无法在Insert()行上将参数值从String转换为Btye []”。
所以是的......真的输了,任何帮助都会非常感激。
答案 0 :(得分:2)
您不需要 SqlDataSource ,它适用于数据绑定控件。你需要的是 SqlConnection&的SqlCommand 即可。 这是你做的:
...your hashing code here...
using (SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=test; Integrated Security=SSPI;"))
{
var command = conn.CreateCommand();
command.CommandText = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, UserType) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);";
command.CommandType = System.Data.CommandType.Text;
command.Parameters.Add(new SqlParameter("insName", txtName.Text));
command.Parameters.Add(new SqlParameter("insUsername", txtUsername.Text));
command.Parameters.Add(new SqlParameter("insHashedPass", hashedPwd));
command.Parameters.Add(new SqlParameter("insSalt", salt));
command.Parameters.Add(new SqlParameter("insType", txtType.Text));
conn.Open();
command.ExecuteNonQuery();
}
另请注意,我已在命令文本中将“Type”更改为“UserType”以匹配您的数据库表定义。当然,您需要替换连接字符串以匹配您的连接字符串。
答案 1 :(得分:0)
我最近遇到了类似的问题。您需要检查创建哈希的类,以查看返回类型。
如果返回类型是字符串,那么您将无法分配到:
byte [] hashedPwd = hashing.ComputeHash(saltAndPwd);