55

我正在尝试编写一个函数来获取一个字符串并 sha512 像这样吗?

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}

魔法应该是什么?

4

11 回答 11

87

您的代码是正确的,但您应该处理 SHA512Managed 实例:

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

512 位是 64 个字节。

要将字符串转换为字节数组,您需要指定编码。如果你想创建一个哈希码,UTF8 是可以的:

var data = Encoding.UTF8.GetBytes("text");    
using (...
于 2012-07-06T18:33:08.977 回答
38

这是来自我的一个项目:

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 用于高效的十六进制字符串构建。
于 2016-08-24T19:41:37.403 回答
8

512/8 = 64,所以 64 确实是正确的大小。也许您想在 SHA512 算法之后将其转换为十六进制。

另请参阅:如何将字节数组转换为十六进制字符串,反之亦然?

于 2012-07-06T18:32:02.550 回答
2

除了使用 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;
}
于 2016-09-21T10:36:40.373 回答
2

您可以尝试以下几行:

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("-", "");
        }

        r = (l ? r.ToLowerInvariant() : r);
    }
    catch
    {

    }

    return r;
}
  1. 它被放置在最后
  2. 它是安全的
  3. 支持小写
于 2019-02-13T03:48:05.463 回答
1

我不确定你为什么期待 128。

一个字节中有 8 位。64 字节。8 * 64 = 512 位哈希。

于 2012-07-06T18:32:00.900 回答
1

来自MSDN 文档
SHA512Managed 算法的哈希大小为 512 位。

于 2012-07-06T18:33:00.393 回答
1

您可以使用 System.Security.Cryptography.SHA512 类

SHA512 上的 MSDN

这是一个示例,直接来自 MSDN

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
于 2012-07-06T18:34:29.050 回答
1

保持简单:

using (SHA512 sha512 = new SHA512Managed())
{
    password = Encoding.UTF8.GetString(sha512.ComputeHash(Encoding.UTF8.GetBytes(password)));
}
于 2021-07-20T20:49:11.893 回答
0
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;
于 2015-06-02T10:45:29.033 回答
-2

我使用了以下

public static string ToSha512(this string inputString)
{
        if (string.IsNullOrWhiteSpace(inputString)) return string.Empty;
        using (SHA512 shaM = new SHA512Managed())
        {
            return Convert.ToBase64String(shaM.ComputeHash(Encoding.UTF8.GetBytes(inputString)));
        }
}
于 2020-05-01T07:19:53.407 回答