也许我只是没有在谷歌上搜索正确的参数,但我似乎无法弄清楚这一点。
我创建了一个散列密码,据我了解,它应该是一个字节数组。然后我需要将它插入到 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[]”。
所以是的......真的迷路了,任何帮助将不胜感激。