2016-08-30 83 views
0

我正在加密一个字符串的项目,这是一个简单的部分。困难的部分是找到一种方法,在加密之前对字符串进行散列,并返回带有冲突域的值。该散列将与加密的字符串一起存储在数据库表中。C#散列与冲突域

这样做的原因是在需要搜索单个记录时创建一个子集进行解密。这怎么可以用C#来完成?

+0

你需要什么帮助,创建冲突域或创建哈希? –

+1

我们在这里谈论多少次碰撞?如果唯一的目的是检查以确保只检查独特的哈希值,则需要进行大量冲突才能使该检查值得。就像斯科特·张伯伦在他的回答中所说的那样,散列会削弱加密,因为它会将信息泄露给坏人。 –

+1

另外,如果你只需要检查碰撞,那么我建议只存储散列。如果您需要取回该值,请存储散列 - >加密数据的查找表,以避免从相同的纯文本中存储多个加密数据斑点。 –

回答

0

我假设您需要帮助创建冲突域,最简单的方法是编写一个函数,将字符串转换为具有高碰撞几率的新字符串,然后将该新字符串散列为查找值。

private static int COLLISION_LENGTH = 5; 
public static string CreateCollision(string oldValue) 
{ 
    var chars = new char[COLLISION_LENGTH]; 

    for(int i = 0; i < oldValue.Length; i++) 
    { 
     chars[i % chars.Length] ^= oldValue[i]; 
    } 

    return new String(chars); 
} 

然后你只需要像你会像Rfc2898DeriveBytes密码散列CreateCollision与您所选择的哈希算法的输出,我建议使用一个强大的哈希系统和对待哈希就像您一个密码(你将需要使用一个固定的盐),因为这个散列确实泄露了你加密的数据的信息。根据需要调整COLLISION_LENGTH

+0

考虑一下之后,我实际上可以使用Adler32的实现来计算值。有谁知道Adler32是否可以找到所有可能的组合来创建相同的值? – schwietertj

+0

这取决于输入,如果文本有一些固定的格式,并且模板和结果之间只有几个词不同,可能会对词位置进行字典攻击,以找出哪些词可以到达哪里哈希结果。 –

+0

这绝对能回答我的问题,因为我们正在处理个人识别号码。我相信我们将使用System.Security.Cryptography.HashAlgorithm来生成我认为在dot net核心中实现的值。 – schwietertj