web-dev-qa-db-ja.com

C#で文字列をSHA512するにはどうすればよいですか?

私は文字列を取得し、それをsha512するように関数を書き込もうとしていますか?

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}

魔法はどうあるべきか?

30
James

コードは正しいですが、SHA512Managedインスタンスを破棄する必要があります。

using (SHA512 shaM = new SHA512Managed())
{
   hash = shaM.ComputeHash(data);
}

512ビットは64バイトです。

文字列をバイト配列に変換するには、エンコードを指定する必要があります。ハッシュコードを作成する場合は、UTF8で問題ありません。

var data = Encoding.UTF8.GetBytes("text");    
using (...
55

これは私のプロジェクトの1つです。

public static string SHA512(string input)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(input);
    using (var hash = System.Security.Cryptography.SHA512.Create())
    {
        var hashedInputBytes = hash.ComputeHash(bytes);

        // Convert to text
        // StringBuilder Capacity is 128, because 512 bits / 8 bits in byte * 2 symbols for byte 
        var hashedInputStringBuilder = new System.Text.StringBuilder(128);
        foreach (var b in hashedInputBytes)
            hashedInputStringBuilder.Append(b.ToString("X2"));
        return hashedInputStringBuilder.ToString();
    }
}

ご注意ください:

  1. SHA512オブジェクトは破棄される(「使用」セクション)ため、リソースリークはありません。
  2. StringBuilderは、効率的な16進文字列の構築に使用されます。
16
Nazar

512/8 = 64ので、64が実際に正しいサイズです。おそらく16進数に変換する必要がありますafter SHA512アルゴリズム。

参照: バイト配列を16進文字列に、またはその逆に変換する方法

8
luiscubal

なぜ128を期待しているのか分かりません。

1バイトに8ビット。 64バイト。 8 * 64 = 512ビットハッシュ。

1

MSDNドキュメント から:
SHA512Managedアルゴリズムのハッシュサイズは512ビットです。

1
Joel Rondeau

System.Security.Cryptography.SHA512クラスを使用できます

SHA512上のMSDN

以下は、MSDNのstraigtの例です。

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
1
Mare Infinitus

System.Security.Cryptographyを使用するWinCrypt-APIの代わりに、BouncyCastleを使用することもできます。

public static byte[] SHA512(string text)
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);

    Org.BouncyCastle.Crypto.Digests.Sha512Digest digester = new Org.BouncyCastle.Crypto.Digests.Sha512Digest();
    byte[] retValue = new byte[digester.GetDigestSize()];
    digester.BlockUpdate(bytes, 0, bytes.Length);
    digester.DoFinal(retValue, 0);
    return retValue;
}

HMACバージョンが必要な場合(ハッシュに認証を追加するため)

public static byte[] HmacSha512(string text, string key)
{
    byte[] bytes = Encoding.UTF8.GetBytes(text);

    var hmac = new Org.BouncyCastle.Crypto.Macs.HMac(new Org.BouncyCastle.Crypto.Digests.Sha512Digest());
    hmac.Init(new Org.BouncyCastle.Crypto.Parameters.KeyParameter(System.Text.Encoding.UTF8.GetBytes(key)));

    byte[] result = new byte[hmac.GetMacSize()];
    hmac.BlockUpdate(bytes, 0, bytes.Length);
    hmac.DoFinal(result, 0);

    return result;
}
1
Stefan Steiger

次の行を試すことができます。

public static string GenSHA512(string s, bool l = false)
{
    string r = "";
    try
    {
        byte[] d = Encoding.UTF8.GetBytes(s);
        using (SHA512 a = new SHA512Managed())
        {
            byte[] h = a.ComputeHash(d);
            r = BitConverter.ToString(h).Replace("-", "");
        }
        if (l)
            r = r.ToLower();
    }
    catch
    {

    }
    return r;
}
  1. 最後に廃棄されます
  2. 安全です
  3. 小文字をサポート
0
V.7
UnicodeEncoding UE = new UnicodeEncoding();            
        byte[] message = UE.GetBytes(password);
        SHA512Managed hashString = new SHA512Managed();
        string hexNumber = "";
        byte[]  hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hexNumber += String.Format("{0:x2}", x);
        }
        string hashData = hexNumber;
0
Mahesh.P