我怎样才能在C#中使用SHA512字符串?

我试着写一个函数来取一个字符串和sha512就像这样?

public string SHA512(string input) { string hash; ~magic~ return hash; } 

魔术应该是什么?

PS我尝试了以下内容,但hash最终仍然是64字节长(不是预期的128)。

 byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; byte[] hash; SHA512 shaM = new SHA512Managed(); hash = shaM.ComputeHash(data); 

提前致谢!

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

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

512位是64字节。

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

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

这来自我的一个项目:

 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用于高效的hex字符串构建。

512/8 = 64 ,所以64确实是正确的大小。 也许你想在SHA512算法之后将它转换为hex。

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

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

一个字节中的8位。 64个字节。 8 * 64 = 512位散列。

从MSDN文档 :
SHA512Managed算法的哈希大小为512位。

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

SHA512上的MSDN

这是一个例子,来自MSDN的straigt

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

使用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版本(为哈希添加身份validation)

 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; } 
 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;