質問

いくつかの異なるコードがありますが、短編小説はSHA1を使用してMySQLデータベースにパスワードを挿入し、SHA1ハッシュを.NETに計算し、それらは一致していません。これは、.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〜?

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

役に立ちましたか?

解決

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

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

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

他のヒント

あなたは置く必要があります [?a??????%l?3~???ヘックス 表現。あなたが印刷しているものはおそらくバイナリ形式です(したがって、倍数 ? chars)。

これをやってみてください:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

かどうかを確認します hexstring およびmysqlハッシュマッチ。

以下は、MySQLが生成するものと正確な一致を与えます。

 BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();

SHA1のハッシュは等しくなければなりませんが、表現はそうではありません。 MySQLは六角形を出力するので、.NETで同じことをする必要があります。

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top