5

JavaScript と .Net の両方で同等の MD5 ハッシュを生成しようとしています。どちらも行っていないので、私は第三者の計算に対して使用することにしました - このWeb サイトの「パスワード」という単語。後でソルトを追加しますが、現時点では、.net バージョンを Web サイトのハッシュと一致させることができません。

5f4dcc3b5aa765d61d8327deb882cf99

エンコーディングの問題だと思いますが、.Net で MD5 ハッシュを計算する方法を 8 種類ほど試しましたが、JavaScript で (または Web サイトから) 取得したものと一致するものはありませんでした。このMSDNの例は、私が試した方法の1つであり、一般的に受け取ったこのハッシュになります。

7c6a180b36896a0a8c02787eeafb0e4c

編集: 悲しいことに、2 つの異なる実装に異なるソース文字列を誤って提供してしまいました。EBSAK。:-/ 引き続きフォローアップへの回答をお待ちしております。

おまけの質問: ハッシュ値をデータベースに保存するには、どのエンコーディング/フォーマットが最適ですか?

4

6 に答える 6

9

引用した MSDN サイトからコードを実行します。

 // Hash an input string and return the hash as
    // a 32 character hexadecimal string.
    static string getMd5Hash(string input)
    {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }


        static void Main(string[] args)
        {
            System.Console.WriteLine(getMd5Hash("password"));
        }

戻り値:

5f4dcc3b5aa765d61d8327deb882cf99
于 2008-10-10T05:28:22.390 に答える
0

MD5の合計はレインボーテーブルで解読できることにも注意してください(インターネット上には、MD5の合計を入力として受け入れ、プレーンテキスト(通常はパスワード)を出力する無料のプログラムがあります)

SHA1はおそらくより良い選択です...

編集:ソルトを追加することは、ハッシュが逆になるのを防ぐための良い方法です
編集2:もし私があなたの投稿を読むのをわざわざしていたなら、あなたがソルトを追加することを計画しているとあなたがすでに述べたことに気づいたでしょう

于 2010-03-02T05:05:19.380 に答える
0

これを実行しようとしているコードはありますか?

(2番目のQへの回答)私は通常、文字列フィールドを使用し、BASE64エンコーディングとして保存します。簡単に操作して比較できます。

/// <summary>
/// Gets the Base 64 encoded SHA1 hashed password
/// </summary>
/// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns>
public string ToBase64SHA1String()
{
    return Convert.ToBase64String(this.GetSHA1HashCode());

}
于 2008-10-10T05:22:45.457 に答える
0

「password」という単語に対して、その Web サイトと同じ値が得られます。

$ echo -n password | md5
5f4dcc3b5aa765d61d8327deb882cf99

実際に使用しているコードを見ないと、何が問題なのかを判断するのは困難です。

ハッシュをデータベースに保存する場合は、16 進文字列として保存します。ほとんどのデータベースはバイナリ BLOB を処理できますが、それらをバイナリとして格納してもスペースを半分しか節約できず、クエリや操作が難しくなります。とにかく、ハッシュと一緒に保存している他のデータが大きい可能性があります

于 2008-10-10T05:19:56.603 に答える
0

この VB.Net バージョンは、私自身の経験から MySQL と同じ結果をもたらします。

Private Function MD5Hash(ByVal str As String) As String

    Dim md5 As MD5 = MD5CryptoServiceProvider.Create
    Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str))
    Dim sb As New StringBuilder

    For i As Integer = 0 To hashed.Length - 1
        sb.AppendFormat("{0:x2}", hashed(i))
    Next

    Return sb.ToString

End Function
于 2008-10-10T05:20:59.097 に答える