2017-03-23 12 views
1

私はVisual Studioでシンプルなログイン登録Windowsアプリケーションをコーディングしていましたので、C# この登録ページにはいくつかのフィールドがあり、コードは非常にシンプルですバリデーションに関連することはしないでください。 私は基本的に別のテキストボックスにC#と出力にSHA1を使用してパスワードをハッシュしようとしていますが、私はここではいくつかの未知の文字にSHA1でのパスワード暗号化で奇妙な結果が出る

を取得していますが、私のコード

private void button1_Click(object sender, EventArgs e) 
    { 
     if (username.Text.Trim()=="" || password.Text=="" ||  passwordc.Text=="" || fname.Text == "" || lname.Text == "" || birthday.Text == "") 
     { 
      MessageBox.Show("Please fill all the fields!"); 

     } 
     else if (password.Text!=passwordc.Text) { 
      MessageBox.Show("Passwords don't match !");    
     } 

     else 
     { 
      String passwd=""; 
      passwd = password.Text; 


      byte[] bytes = System.Text.Encoding.UTF8.GetBytes(passwd); 
      SHA1 sha = new SHA1CryptoServiceProvider(); 
      byte[] passbyte = sha.ComputeHash(bytes); 
      string pass = System.Text.Encoding.UTF8.GetString(passbyte); 
      textBox1.Text = pass; 

     } 

https://i.stack.imgur.com/SOPit.png

あるものはあります間違っているか、これは通常のハッシングですか?私はちょっと混乱している。

ありがとうございました

答えて

0

ハッシュはちょうどバイトの束です。意味のある文字ではありません。あなたがテキスト形式にハッシュを有効にしたい場合は、Convert.ToBase64String()を使用することができます。また

string pass = Convert.ToBase64String(passByte); 

は、SHA256への切り替えを検討してください。 SHA1は、コンピューティングパワーが向上するにつれて、より簡単にクラックするようになっています。 1つの一般的なことは、ハッシュ処理を実行することです(新しいハッシュはハッシュするパスワードになります)。これは、格納するハッシュを作成するためにあまりにも大きな時間差を作るわけではありませんが、パスワードを解読することは何倍も長くかかることになります。

また、ハッシュする各パスワードにランダムな塩を組み込むことをお勧めします。これにより、レインボーテーブルの攻撃を防ぎ、同一のパスワードに対して同じハッシュを生成することはありません。

+0

ありがとうございました。 しかし、私はその行を考えていた string pass = System.Text.Encoding.UTF8.GetString(passbyte)はそれをテキストに変換するものでした。なぜそれを追加したのですか?それは間違っていますか? – Issam

+0

@IssamバイトがUTF8文字を表す場合にのみ機能します。ハッシュ結果はありません。 – itsme86

+0

"また、SHA256に切り替えることを検討してください。パスワードハッシングで必要となる主なセキュリティ要因は低速です。 pbkdf2、bcrypt、scryptのようなデザインは、この目的にはより適切です。また、それらのデザインにはすでに塩が組み込まれています。詳細については、この[netsecスレッド](https://www.reddit.com/r/netsec/comments/5ya6uw/multiple_vulnerabilities_discovered_in_dna/)を参照してください。 – TheGreatContini

関連する問題