Не уверен, почему у вас не работает, но когда я написал реализацию SHA512 ниже, у меня были некоторые проблемы с хэшем. Он не выводится так, как вы обычно видите для людей. По этой причине ваш тип данных должен быть двоичным в базе данных. Также вот реализация, которую я использую (с измененной солью), которая использует SHA512. Использование ByteArrayToHexString помещает его в распознаваемый человеком формат. Тогда вы можете использовать varchar в базе данных.
/// <summary>
/// Takes a string as input, SHA512 hashes it, and returns the hexadecimal representation of the hash as a string.
/// </summary>
/// <param name="toHash">string to be hashed</param>
/// <returns>hexadecimal representation of the hash as a string</returns>
private string GetHash(string toHash)
{
/* As of this writing, both the –Cng and –CryptoServiceProvider implementation classes are FIPS-certified,
* but –Managed classes are not. http://msdn.microsoft.com/en-us/magazine/ee321570.aspx
*/
// Salt the string
toHash = "%my" + toHash.Insert(Convert.ToInt16(toHash.Length / 2), "!secret") + ".sauce#";
SHA512CryptoServiceProvider hasher = new SHA512CryptoServiceProvider();
byte[] hashBytes = hasher.ComputeHash(Encoding.Unicode.GetBytes(toHash));
hasher.Clear();
return ByteArrayToHexString(hashBytes);
}
/// <summary>
/// Takes a byte[] and converts it to its string hexadecimal representation
/// </summary>
/// <param name="ba">Array of bytes[] to convert</param>
/// <returns>string, hexadecimal representation of input byte[]</returns>
private string ByteArrayToHexString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}