web-dev-qa-db-ja.com

md5ハッシュバイト配列を文字列に変換する

ハッシュ化された結果(バイト配列)を文字列に変換するにはどうすればよいですか?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 

byteHashedPasswordを文字列に変換する必要があります。

70
Blankman
   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

次に、それを拡張メソッドとして呼び出すことができます。

string hexString = byteArray.ToHex(false);
74

私はこれが最も便利だといつも思っていました。

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

何らかの奇妙な理由で、BitConverterはバイト間にダッシュを挿入することを好むので、置換は単にバイトを削除します。

更新:「小文字」の16進数が必要な場合は、.ToLower()とboomを実行してください。

これをタイトループと多くのopとして実行している場合、少なくとも2つの暗黙的な文字列キャストとサイズ変更が行われるため、コストが高くなる可能性があることに注意してください。

62
GrayWizardx

Convert.ToBase64StringおよびConvert.FromBase64Stringを使用して、バイト配列を文字列に簡単に変換できます。

24
David

「Hex preference」キャンプにいる場合、これを行うことができます。これは基本的に、Philippe Leybaertによる回答の最小バージョンです。

string.Concat(hash.Select(x => x.ToString("X2")))

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

17
Simon_Weaver

ハッシュであるため、通常の文字列では表示できない値が含まれている可能性があるため、最善の方法はそれをBase64エンコード文字列に変換することです。

string s = Convert.ToBase64String(bytes);

そして使用する

byte[] bytes = Convert.FromBase64(s);

バイトを取り戻すため。

8
AxelEckenberger

さて、バイトとエンコードを使用する文字列コンストラクタを使用できますが、多くの楽しい文字(nullバイト、改行、制御文字など)が含まれている可能性があるため、文字列の管理が困難になる可能性があります

これを行う最善の方法は、base 64でエンコードして、扱いやすいNice文字列を取得することです。

string s = Convert.ToBase64String(bytes);

そして、その文字列からバイト配列に戻るには:

byte[] bytes = Convert.FromBase64String(s);
3
Eric Petroelje

私が作成したNugetパッケージCryptoStringifyに興味がある人は、ナイスな構文を使用して文字列をハッシュ文字列に変換できます。バイト配列:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

HashAlgorithmKeyedHashAlgorithmの拡張メソッドなので、SHA1、HMACSHA1、SHA256などでも機能します。

https://www.nuget.org/packages/cryptostringify

0
garryp