【发布时间】:2012-05-29 14:24:12
【问题描述】:
也许我只是没有在谷歌上搜索正确的参数,但我似乎无法弄清楚这一点。
我创建了一个散列密码,据我了解,它应该是一个字节数组。
然后我需要将它插入到 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);,但我什至无法编译/构建网站。我明白了; “无法从 byte[] 转换为 String”。
如果我将其更改为 salt.ToString() 我会得到; Insert() 行上的“无法将参数值从字符串转换为 Btye[]”。
所以是的...真的迷路了,任何帮助将不胜感激。
【问题讨论】: