也許我只是沒有使用google搜索正確的參數,但我似乎無法找出這一個。
我已經創建了一個哈希密碼,根據我的理解,它應該是一個字節數組。 然後我需要將它插入到SqlDataSource中,這就是我的問題所在。問題插入字節[]到SqlDataSource ASP.Net
我的數據庫定義如下;
**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);
,但我甚至無法編譯/構建網站。我得到; 「無法從字節[]轉換爲字符串」。
如果我將其更改爲salt.ToString()
,我會得到; 「無法將參數值從字符串轉換爲Insert()行上的Btye []」。
所以是的...真的失去了,任何幫助將不勝感激。
OK,該代碼有效。感謝那。 您能否爲我澄清一下,爲什麼我不使用SqlDataSource?我會使用SqlDataSource訪問顯示數據庫中的用戶和類型的GridView嗎?當我瀏覽這個頁面時,它就是這樣的; http://www.asp.net/web-forms/tutorials/moving-to-aspnet-20/data-bound-controls – FizzBuzz
不客氣。引用MSDN,SqlDataSource _「將SQL數據庫表示爲數據綁定控件。「_所以,是的,你可以使用它在它和GridView之間來回傳遞數據,因爲GridView是一個數據綁定控件。另一方面,這裏只是存儲一些數據(不是來自任何控件)到一個數據庫表。 – m1kael
很好,謝謝澄清。 – FizzBuzz