我应该如何在C#中散列这些数据?

时间:2018-05-16 16:36:58

标签: c# security hash

我有一个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;
}

3 个答案:

答案 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就足够了,但如果您需要非常强大的安全性,您应该研究您的问题并告诉我们更多相关信息。