2016-06-19 16 views
0

を検証します。ここに私のコードは次のとおりです。bcryptのは、私がDBにハッシュされたパスワードを保存しようとしているパスワード

string passwords = textBox2.Text; 
string salt = BCrypt.Net.BCrypt.GenerateSalt(12); 
string hashPwd = BCrypt.Net.BCrypt.HashPassword(passwords, salt); 
     try 
     { 
      SQLiteCommand command = new SQLiteCommand(); 
      connection.Open(); 
      command.Connection = connection; 
      command.CommandText = ((@"INSERT INTO acc (UserName, Pass) VALUES ('" + textBox1.Text + "','" + hashPwd+ "');")); 
      command.ExecuteNonQuery(); 
      connection.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error:" + ex.ToString()); 
      return; 
     } 

ログイン/検証コード

  try 
      { 

      SQLiteDataAdapter sqlad = new SQLiteDataAdapter("SELECT COUNT(*) From acc WHERE Username = '" + textBox1.Text + "' AND Pass = '" + textBox2.Text + "' ", connection); 
      DataTable dt = new DataTable(); 
      sqlad.Fill(dt);` 
      string userid = dt.Rows[0]["UserName"].ToString(); 
      string password = dt.Rows[0]["Pass"].ToString(); 
      bool flag = BCrypt.Net.BCrypt.Verify(textBox2.Text, password); 

      if (userid == textBox1.Text && flag == true) 
      { 
       Form2 frm = new Form2(); 
       frm.Show(); 
      } 
      else 
      { 
       MessageBox.Show("Invalid UserId or password"); 
      } 
      } 
      catch (Exception ex) 
      { 
      MessageBox.Show(ex.ToString()); 
      return; 
      } 

私はパスワードを確認できない、私はエラーを取得しています、あなたは私を助けてくださいだろうか?もう一つ質問ですが、塩分もデータベースに保存すべきですか?

+2

でしょうか?あなたのデータベースのパスワードはハッシュされており、おそらく 'textBox2.Text'にプレーンテキストが含まれているので、何も見つかりません。'UserName'と' Pass'カラムではなく、カウントを返すので、結果セットには含まれません。最後に、SQLインジェクションを読んで読んでみたいかもしれません。 – steve16351

+0

ユーザーが入力したパスワードと、データベースにハッシュされたパスワードを比較するにはどうすればよいですか? –

+0

[この記事](https://crackstation.net/hashing-security.htm)であり、特に、[このセクション](https://crackstation.net/hashing-security.htm#properhashing)を見て@LuisVito 。関連する手順がここにリストされています。記事全体を読むことを検討してください。それはいいです:-) – khlr

答えて

2

あなたのコードに問題がいくつかあります:彼らはテキストは、ユーザーから直接取ることができ以来

どちらもあなたのインサートと検証コードブロックは、SQLインジェクションに対して脆弱である

1. SQLインジェクションは、実行されたSQL文字列への入力、ログインチェックを無効にする脆弱性、データベースを破壊する脆弱性などがあります。しないでください!

2.バックデータベースからハッシュされたパスワードのあなたの選択は、ハッシュされたパスワード。..や興味のあるものを選択していません。 「ab123cdef」にハッシュされ、そしてあなたのaccに挿入されてしまった「ハロー」として

SQLiteDataAdapter sqlad = new SQLiteDataAdapter(@" 
    SELECT 
     COUNT(*) 
    From 
     acc 
    WHERE 
     Username = '" + textBox1.Text + "' 
     AND 
     Pass = '" + textBox2.Text + "' ", connection); 

だから、言わせて、私は「スティーブ」として自分のユーザー名を与え、パスワード、:

あなたがここに持っているものを検討表のように:

UserName Pass 
Steve  ab123cdef 

そして、私は、元の正しいユーザー名とパスワードでこれを検証するために来るとき、あなたのselect文は、意志、「「スティーブのユーザ名と私の行数を与えると 『ハロー』合格」と言います正にゼロを返します。

あなたのコードはここに例外をスローする必要があります

string userid = dt.Rows[0]["UserName"].ToString(); 

結果セットが出力としてユーザ名が含まれていませんので。ここで

はあなたが成功したパスワードを挿入し、検証することができる方法を示すために選択したライブラリを使用して、基本的な少しの例です。

塩で何をするかについては、関数HashPasswordがパスワードのハッシュに塩を前置しています。したがって、この出力を保存すると塩が保存されます。検証で使用するverify関数が処理し、これをチェックします。

static void CreateUser(string username, string password) 
{ 
    if (UserExists(username)) 
     throw new InvalidOperationException("User already exists"); 

    string salt = BCrypt.Net.BCrypt.GenerateSalt(12); 
    // if you look at the hashed password, notice that it's prepended with the salt generated above 
    string hashedPassword = BCrypt.Net.BCrypt.HashPassword(password, salt); 

    using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
    { 
     connection.Open(); 
     SQLiteCommand insertCommand = new SQLiteCommand(connection); 
     insertCommand.CommandText = @"INSERT INTO acc (UserName, Pass) VALUES (@username, @hashedPass);"; 
     // use parameterised queries to mitigate sql injection 
     insertCommand.Parameters.Add(new SQLiteParameter("@username", username)); 
     insertCommand.Parameters.Add(new SQLiteParameter("@hashedPass", hashedPassword)); 
     insertCommand.ExecuteNonQuery(); 
    } 
} 

我々は戻って、データベースから必要なのは、我々が与えられていたものに対して確認するために、ハッシュ関数の出力で、指定したユーザ名/パスワードを確認します。

static bool Verify(string username, string password) 
{ 
    using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
    { 
     connection.Open(); 

     SQLiteCommand checkUserCommand = new SQLiteCommand(connection) 
     { 
      CommandText = @"SELECT Pass FROM acc WHERE UserName = @username;" 
     }; 

     checkUserCommand.Parameters.Add(new SQLiteParameter("@username", username)); 
     var hashedPassword = (string)checkUserCommand.ExecuteScalar();     
     return BCrypt.Net.BCrypt.Verify(password, hashedPassword);     
    } 
} 

SELECT文で、あなたが持っている ``とパス= ' "+ textBox2.Text +"' なぜ使用法は、何かのような..

if (!UserExists(username)) 
{ 
    CreateUser(username, password); 
    Console.WriteLine("User {0} created", username); 
} 
else 
{ 
    bool loginOk = Verify(username, password); 
    Console.WriteLine("Login ok?: {0}", loginOk); 
} 
+0

ありがとうございました。私は注射について読むでしょう。 –

関連する問題