9

いくつかの異なるコードがありますが、簡単に言うと、SHA1を使用してMySQLデータベースにいくつかのパスワードを挿入し、.NETでSHA1ハッシュを計算しますが、それらは一致していません。これは、.NETのエンコーディングコードの問題だと思います。

SQLコード:

INSERT INTO user_credentials (Password) VALUES (SHA1('password'));

5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8へのパスワードハッシュ

.NETコード:

public static string GetPasswordHash(string password)
{
    // problem here with encoding?
    byte[] byteArray = Encoding.ASCII.GetBytes(password);

    SHA1 sha = new SHA1CryptoServiceProvider();
    byte[] hashedPasswordBytes = sha.ComputeHash(byteArray);

    return Encoding.ASCII.GetString(hashedPasswordBytes);
}

パスワードは[?a ??????%l?3〜???にハッシュされます

助けてくれてありがとう!

4

5 に答える 5

16

MySQLの例では、16進文字列にエンコードしていますが、.NETの例では、ASCIIでエンコードしています。2つのエンコーディングは同じではありません。

.NETバージョンで16進数に変換すると、正しい結果が得られます。

string hex = BitConverter.ToString(hashedPasswordBytes);

結果:

5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8
于 2010-10-12T18:04:04.860 に答える
3

HEX表現[?a??????%l?3~???を入れる必要があります。印刷するものはおそらくバイナリ形式です(したがって、複数の文字)。?

これを試してみてください:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

そしてhexstring、MySQLハッシュが一致するかどうかを確認します。

于 2010-10-12T18:04:07.127 に答える
2

以下は、MySQLが生成するものと完全に一致するものです。

 BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();
于 2012-03-20T16:16:07.410 に答える
1

SHA1ハッシュは等しくなければなりませんが、表現は等しくありません。MySqlは16進文字列を出力するため、.NETでも同じことを行う必要があります。

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))
于 2010-10-12T18:06:13.373 に答える
0

MySQLテーブル/データベースはどのようにエンコードされていますか?両方をUTF-8に設定してみてください(したがって、Encoding.UTF8.GetBytesを使用します)

于 2010-10-12T18:04:24.597 に答える