0

たぶん私は正しいパラメータをグーグルで検索していないだけかもしれませんが、これを理解できないようです。
私の理解では、バイト配列である必要があるハッシュ化されたパスワードを作成しました。次に、それを SqlDataSource に挿入する必要があります。そこに問題があります。

私のデータベース定義は次のとおりです。

 
**列** || **データ・タイプ**
----------------------------  
名前 || varchar(50)  
ユーザー名 || varchar(50)  
|| ハッシュされたPwd || varbinary(50)  
|| ソルト varbinary(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();

データベースに関するものは、インターネットでの調査と、Visual Studio の便利なオートコンプリート機能でどのようなオプションが提供されているかを調べて収集したものです。
参考までに、Visual Studio 2010 バージョン 10.0.4、.Net バージョン 4.0.3
を使用しています。SQL 接続用の外部ライブラリがいくつかあるようですが、.Net が提供する組み込みのものを使用することをお勧めします。

現在、挿入アルゴリズムを実行するとこのエラーが発生します。
データ型 nvarchar から varbinary への暗黙的な変換は許可されていません。CONVERT 関数を使用して、このクエリを実行します。
convert 関数の使い方がわかりません。
Add() メソッドは、現在行っているように文字列、文字列を取ることができます。また、文字列、DbType、文字列を取ることもできます。試してみましdatabase.InsertParameters.Add("insSalt", DbType.Binary, salt);たが、Web サイトをコンパイル/ビルドすることさえできません。わかります。「バイト[]から文字列に変換できません」。
に変更すると、次のよう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();
}

また、DB テーブルの定義と一致するように、コマンド テキストの「Type」を「UserType」に変更したことにも注意してください。もちろん、接続文字列を自分のものと一致するように置き換える必要があります。

于 2012-05-29T16:47:14.797 に答える