2

現在、データを取得して保存するためにMySQLデータベースに接続するソフトウェアに取り組んでいます。ソフトウェア自体は正常に動作していますが、いくつかの新しいセキュリティ機能を実装したいと思います。

これらのセキュリティ機能の1つは、データベースユーザーのパスワードをプレーンテキストではなくハッシュとして保存することです。ちなみに、私はユーザーを確認するためにテーブルを使用していません。データベース自体に接続するためのデータベースユーザーについて話しています。

私は現在、パスワードをプレーンテキストで送信するMySQL接続文字列を使用しています。

public abstract Database()
    {
        ReadConfig();
        connectionstring = "SERVER=" + server + ";" +
                "DATABASE=" + database + ";" +
                "UID=" + username + ";" +
                "PASSWORD=" + password + ";";
        try
        {
            connection = new MySqlConnection(connectionstring);
        }
        catch (MySqlException ex)
        {
            LogService.Log("ERROR - " + ex.ToString());
        }
    }

また、このデータをユーザーのコンピューターに保存して、ユーザーがサーバーアドレス、データベース、ユーザー名、およびパスワードを変更できるようにします。私が言ったように、これはプレーンテキストで保存されます。プレーンテキストとして保存されているサーバーアドレス、データベース名、およびユーザー名は私には問題ありませんが、パスワードをプレーンテキストで保存したくありません。

SHA1ハッシュ(または他のハッシュメソッド)を生成することは問題ではありません。これらのハッシュを生成するメソッドがすでにあるからです。

つまり、パスワードをハッシュとして保存し、そのハッシュを接続文字列で使用したいと思います。どうすればこれを実装できますか?

編集:これは「隠すことによるセキュリティ」ソリューションであり、ソフトウェアのセキュリティを拡張するための最良の方法ではないことを認識しています。チャレンジレスポンス方式の使い方を検討していますが、とりあえず上記を実装したいと思います。

4

1 に答える 1

2

ここでできる最善のことは、ユーザーのログイン情報を暗号化し、ログインするときにプレーンテキストを使用することです。MySQLはハッシュ値を取得しません-取得した場合、これは元の(ハッシュされていない)値を使用するよりも安全ではありません。

「共有秘密」の課題は、サーバー上のプロキシを使用してログインを制御することです。クライアントが接続したい場合、サーバープロキシはランダムビットの長い文字列を送信します。クライアントは、この最後に(共有)「秘密のテキスト」を追加し、SHA-1ハッシュを使用して、サーバーに送り返します。サーバーはテキストに対して同じことを行い、文字列を比較します。このように、それは本質的に毎回異なるパスワードであり、それを盗聴することは重要ではありません。

クライアントが認証されると、サーバープロキシはmysqlプロセスとの通信を有効にします。libmysql(またはそのc#)と同等のものを使用すると、「通常の」mysqlクライアントで発生するすべてのものを複製できます。

于 2012-09-28T10:47:44.277 に答える