0

リモート MySQL データベースを作成し、それを WPF アプリケーションにリンクしようとしました。私はなんとかそれを行うことができましたが、フォーラムのユーザーから、パスワードをハッシュするようにアドバイスされました。これは、SQL が簡単に挿入される可能性があるためです。私の質問は、そのコードに基づいてハッシュ化されたパスワードを作成する方法を知っている人はいますか?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace ECBSRecruitmentAgencySoftware
{
    public partial class LogIn : Form
    {
        public LogIn()
        {
            InitializeComponent();
        }  

        public bool tryLogin(string username , string password)
        {
             MySqlConnection con = new MySqlConnection("host=aaaaaaaa.baaadsg;user=saaaaaak;password=2333333336;database=soaaaaaaaa2;");
             MySqlCommand cmd = new MySqlCommand("Select * FROM niki WHERE user_name = `" + username + "` AND user_password = `" + password + "`;");
             cmd.Connection = con;
             con.Open();
             MySqlDataReader reader = cmd.ExecuteReader();
             if (reader.Read() != false)
             {
                 if (reader.IsDBNull(0) == true)
                 {
                     cmd.Connection.Close();
                     reader.Dispose();
                     cmd.Dispose();
                     return false;
                 }
                 else
                 {
                     cmd.Connection.Close();
                     reader.Dispose();
                     cmd.Dispose();
                     return true;
                  }
             }
             else 
             {
                 return false;
             }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (tryLogin(user.Text, pass.Text) == true)
            {
                MainScreen F2 = new MainScreen();
                F2.Show();
                this.Hide();
            }            
            else 
                MessageBox.Show("Wrong details!");             
        } 
    }
 }
4

5 に答える 5

2

.NET は MD5 や SHA などのいくつかの暗号化ハッシュをサポートしているためComputeHash、これらのクラスのメソッドを使用してパスワードを簡単にハッシュできます...

MD5 を使用してファイルをハッシュする簡単な例を次に示します。これは簡単に変換してパスワード ハッシュを生成できます。

        using (var md5 = new MD5CryptoServiceProvider())
        {
            var buffer = md5.ComputeHash(File.ReadAllBytes(filename));
            var sb = new StringBuilder();
            for (var i = 0; i < buffer.Length; i++)
            {
                sb.Append(buffer[i].ToString("x2"));
            }
            return sb.ToString();
        }

ハッシュをソルトすることを忘れないでください...

実際には、CP 上のデータベースにパスワードを保存することに関するこの素晴らしい記事を読むのがおそらく最善でしょう...

パスワード保存の芸術と科学

于 2012-05-16T19:17:51.813 に答える
1

SHA256 などのハッシュ アルゴリズム プロバイダーを使用します。

var hasher = new SHA256Managed();
var unhashed = System.Text.Encoding.Unicode.GetBytes(password);
var hashed = hasher.ComputeHash(unhashedPassword);

ここで、SQL クエリで格納および比較するために、バイトを Base64Encoded などの文字列表現に変換します。

var hashedPassword = Convert.ToBase64String(hashed);

これで、クエリで hashedPassword の値を使用できるようになりました。

でも...

また、アプリケーション全体、またはユーザーごとにソルト値を生成することも検討する必要があります。それを格納するためにテーブルに列が必要であり、パスワードが変更されるたびにユーザーごとにランダムに生成します。次に、次のようなものを使用して、ハッシュ化されたパスワードを作成します。

static byte[] GenerateSaltedHash(string plainText, string salt)
{
HashAlgorithm algorithm = new SHA256Managed();

byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
byte[] saltBytes = Convert.FromBase64String(salt);

byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
salt.CopyTo(plainTextWithSaltBytes, 0);
plainText.CopyTo(plainTextWithSaltBytes, salt.Length); 

byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

return hash;
}

すべてを一緒に入れて...

// omitted

namespace ECBSRecruitmentAgencySoftware
{
    public partial class LogIn : Form
    {
        // omitted


    static byte[] GenerateSaltedHash(string plainText, string salt)
    {
       HashAlgorithm algorithm = new SHA256Managed();

       byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
       byte[] saltBytes = Convert.FromBase64String(salt);

       byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
       salt.CopyTo(plainTextWithSaltBytes, 0);
       plainText.CopyTo(plainTextWithSaltBytes, salt.Length); 

       byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

       return hash;
    }

        public bool tryLogin(string username , string password)
        {
             using (var con = new MySqlConnection("host=aaaaaaaa.baaadsg;user=saaaaaak;password=2333333336;database=soaaaaaaaa2;"))
             {
                 con.Open();

                 var salt = string.Empty;

                 using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username"))
                 {
                     cmd.Parameters.AddWithValue("@username", username);

                     salt = cmd.ExecuteScalar() as string;
                 }

                 if (string.IsNullOrEmpty(salt)) return false;

                 var hashedPassword = GenerateSaltedHash(password, salt);

                 using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password"))
                 {
                    cmd.Parameters.AddWithValue("@username", username);
                    cmd.Parameters.AddWithValue("@password", hashedPassword);

                    using (var reader = cmd.ExecuteReader())
                    {
                         return reader.Read();
                    }
                 }
             }
        }

        // omitted
    }
 }
于 2012-05-16T19:17:11.517 に答える
0

このコードで安全な認証方法を確立できるとは思えません。

まず、コード内のデータベースにパスワードを保存します。そのため、誰でも Reflector またはその他の .NET デコンパイラを使用して、パスワードをデータベースに抽出できます。次に、完全な接続文字列を使用すると、誰でもデータベースに接続して侵害することができます (たとえば、すべてのユーザー パスワードを盗む)。難読化ツールを使用している場合でも、アプリケーションからこの文字列を抽出することは可能です。

したがって、実際には問題ではありません。ユーザーのパスワードをハッシュするかどうかは問題ではありません。誰でもシステムにアクセスできます。

パスワード検証を実行するより安全な方法は、マルチタイヤ システムを作成することです。そのため、WPF アプリケーションはデータベースに直接アクセスできず、アプリケーション サーバーを使用してデータの操作を実行します。通信には、Web サービス、WCF を使用できます。データベースへの接続文字列は、アプリケーション サーバーにのみ保存されます。

では、ハッシュはどうでしょう。

ハッシュを使用する理由を見つける必要があります。ハッシュを使用してデータベースに保存できます(したがって、クリアパスワードはどこにも保存されません)。ハッシュを使用してネットワーク経由でパスワードを送信できるため、メッセージが傍受されたとしても、誰も明確なパスワードを見つけることはありません)。または、この両方にハッシュを使用できます。

パスワード ハッシュをデータベースに格納する場合は、ASP.NET メンバーシップ プロバイダーのビルドのデータベース スキームを調査する必要があります。

選択したオプションに基づいて、実際のパスワード検証を実装できます。

実際には、ハッシュをどのように計算するかは問題ではありません。.NET Framework に組み込まれている SHA512 など、十分に強力なハッシュ アルゴリズムである必要があります。

于 2012-05-16T19:32:39.793 に答える
0

それを行う関数を作成します。

これはasp.NETです

public static string PasswordHasher(string Password)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(Password,     
System.Web.Configuration.FormsAuthPasswordFormat.SHA1);
}
于 2012-05-16T19:11:44.747 に答える
0

.Net には、MD5 ハッシュ アルゴリズムおよび他の多くのハッシュ アルゴリズムのサポートが組み込まれています。これについては、Microsoft の Web サイト ( https://msdn.microsoft.com/en-us/library/system.security.cryptography.md5(v=vs.110).aspx#Examples ) に非常に良い例があります。

ハッシュが必要な方法と理由について詳しくは、https ://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right のサイトをご覧ください。

于 2018-01-03T05:10:49.883 に答える