我有一个12个字符的字符串数据字段,字母数字(字母和数字)。出于安全原因,我需要在此字段上执行单向散列。为了准确报告,我应该使用什么算法来避免冲突(不同的值散列到相同的值)?这会成功吗?
Edit: Here is the code based on suggestions in comments so far:
public static string GetHashedValue(string Input)
{
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(Input);
bytes = new System.Security.Cryptography.SHA512Managed().ComputeHash(bytes);
String output = Convert.ToBase64String(bytes);
return output;
}
答案 0 :(得分:3)
我建议你应该得到一个base64字符串来防止数据丢失,这样你就可以避免获得高碰撞机会。即:
public static string GetHashedValue(string Input)
{
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(Input);
bytes = new System.Security.Cryptography.SHA512Managed().ComputeHash(bytes);
string output = Convert.ToBase64String(bytes);
return output;
}
编辑:哈希是一种方式,非常适合存储密码。如果您希望使用密钥返回原始值,则使用对称算法。
答案 1 :(得分:1)
我认为你不熟悉密码哈希的概念。
加密散列有一些属性,包括(1)preimage-resistance,即。你无法从散列中有效地找到原始值和(2)碰撞阻力,即。你不能有效地找到一对具有相同散列的输入,并且还给出带有散列的输入,你不能有效地找到具有相同散列的另一个输入(弱和强碰撞抵抗)。
然而,这并不意味着根本没有碰撞。需要输入具有相同的散列值,因为输出具有有限长度(sha256和512为256或512位),但输入是有限的但不是有界的,即。任意长。您可以很容易地看到输入比输出多得多,因此必须存在冲突。
这只是很难找到它们,这意味着理想情况下,在加密哈希的情况下,找到碰撞的最佳方法是蛮力,这对于256位输出是不可行的,更不用说512。
所以对你的问题的答案是,在sha256甚至是sha512的情况下,只要没有已知的攻击,你真的真的不可能找到碰撞反对那些算法。
现在有针对sha2的攻击,但实际上,你仍然不太可能发现碰撞。有关详细信息,请参阅here。
出于许多目的,sha2仍然是好的,对于其他人,可能不是。
请注意,与另一个答案相反,sha2不适合的一件事是密码哈希。
答案 2 :(得分:-1)
避免碰撞是本世纪的问题。但解决方案只取决于对你来说什么是好的。 如果您的输入字符串是待办事项列表应用程序的密码,那么Sha256就足够了,但如果您需要非常强大的安全性,您应该研究您的问题并告诉我们更多相关信息。