1

プログラムにユーザーのパスワードを保存しようとしていますが、プレーン テキストで保存したくありません。したがって、私はそれをハッシュして代わりに保存しています。ユーザーがプログラムの開始時にパスワードを入力する必要がある場合 (不正なユーザーから保護するため)、入力されたパスワードをハッシュし、2 つのハッシュを比較しています。

ただし、次のコードは、入力されたほぼすべてのパスワードに対して同じハッシュを生成しています。次のコードを修正する方法を誰かに教えてもらえますか、またはより良いハッシュ関数を教えてもらえますか?

public static string getSHA1(string userPassword)
{
    return BitConverter.ToString(SHA1Managed.Create().ComputeHash(Encoding.Default.GetBytes(userPassword))).Replace("-", "");
}

ご協力ありがとうございます。

4

2 に答える 2

1

このようなものを使用してください

    private static string GetSHA1(string text)
    {
        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] hashValue;
        byte[] message = UE.GetBytes(text);

        SHA1Managed hashString = new SHA1Managed();
        string hex = "";

        hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }
于 2011-07-11T01:09:14.413 に答える
0

関数を新しいプロジェクトにプラグインしましたが、正常に動作しているように見えました。パスワードが関数にどのように提供されているかを確認してください。Encoding.Defaultシステムに依存すると書かれているため、明示的なコーディングの代わりに使用することには注意が必要です。

これが私が作ったものです:

    public static string getSHA1(string userPassword)
    {
        return Convert.ToBase64String(new SHA1Managed().ComputeHash(Encoding.Unicode.GetBytes(userPassword)));
    }

注:コメントで指摘されているように、この方法でパスワードの保存/照合を行うのは悪いことです:

  • 高速ハッシュ アルゴリズムを使用しています。ブルート フォース攻撃を軽減するために、パスワード ハッシュを遅くする必要があります。Bcryptはこれをうまく処理します。
  • ハッシュを塩漬けしていません。ソルティングとは、ハッシュする前にパスワードにランダム データを追加し、そのランダム データをハッシュと共に保存することを意味します。これにより、レインボー テーブル (パスワード マップへの巨大なハッシュ) が役に立たなくなります。
于 2011-07-11T01:02:56.487 に答える