1. ホーム
  2. c#

[解決済み] Sha256で文字列をハッシュ化する

2022-04-26 02:50:49

質問

私はSHA256を使って文字列をハッシュ化しようとしています。

using System;
using System.Security.Cryptography;
using System.Text;
 public class Hash
    {
    public static string getHashSha256(string text)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(text);
        SHA256Managed hashstring = new SHA256Managed();
        byte[] hash = hashstring.ComputeHash(bytes);
        string hashString = string.Empty;
        foreach (byte x in hash)
        {
            hashString += String.Format("{0:x2}", x);
        }
        return hashString;
    }
}

しかし、このコードは、私の友人のphpやオンラインジェネレータ(以下のような)と比較して、著しく異なる結果をもたらします。 このジェネレーターは )

どなたかエラーの内容をご存知の方はいらっしゃいますか?ベースが違う?

解決方法を教えてください。

Encoding.Unicode は、UTF-16(ダブルワイドエンコーディング、歴史的な理由でWindowsの世界で使われているが、他の誰も使っていない)のMicrosoftの誤解を招く名前です。 http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx

を検査すると bytes の配列を見ると、2 バイトごとに 0x00 (ダブルワイドエンコーディングのため)。

を使用する必要があります。 Encoding.UTF8.GetBytes の代わりに

しかしまた、終端文字である '\0' バイトはハッシュ化するデータの一部です。2バイトをハッシュ化すると "Hi" をハッシュ化するのとは異なる結果になります。 さん バイト "Hi" . どちらをやるかは自分で決めなければなりません。(おそらく、友人の PHP コードがやっているほうを実行したいのでしょう)。

ASCIIテキストの場合。 Encoding.UTF8 は間違いなく適しています。もし、あなたが目指しているのが パーフェクト 非ASCII入力であっても、友人のコードと互換性を保つには、以下のような非ASCII文字を使ったテストケースをいくつか試してみた方がよいでしょう。 é を実行し、結果が一致するかどうかを確認します。そうでない場合は、あなたの友人が実際に使っているエンコーディングを調べる必要があります。それは、Unicodeが発明される前に普及していた8ビットのquot;コードページ"の1つかもしれません。(繰り返しになりますが、Windowsが、誰もがいまだに"コードページ"について心配する必要がある主な理由だと思います)。