0

也许我只是没有在谷歌上搜索正确的参数,但我似乎无法弄清楚这一点。
我创建了一个散列密码,据我了解,它应该是一个字节数组。然后我需要将它插入到 SqlDataSource 中,这就是我的问题所在。

我的数据库定义如下;

 
**专栏** || **数据类型**
----------------------------  
姓名 || varchar(50)  
用户名 || varchar(50)  
哈希密码 || 变量二进制 (50)  
盐 || 变量二进制 (50)  
用户类型 || 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();

数据库的东西是我从 Internet 上的研究中收集到的,并查看了 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);,但我什至无法编译/构建网站。我明白了;“无法从字节 [] 转换为字符串”。
如果我把它改成salt.ToString()我得到;Insert() 行上的“无法将参数值从字符串转换为 Btye[]”。

所以是的......真的迷路了,任何帮助将不胜感激。

4

2 回答 2

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();
}

另请注意,我已将命令文本中的“类型”更改为“用户类型”以匹配您的数据库表定义。当然,您需要替换连接字符串以匹配您的。

于 2012-05-29T16:47:14.797 回答
0

我最近遇到了类似的问题。您需要检查创建哈希的类以查看返回类型是什么。

如果返回类型是字符串,那么您将无法分配给:

byte[] hashedPwd = hashing.ComputeHash(saltAndPwd);

于 2012-05-29T14:28:06.917 回答