对于散列函数,最佳的安全方法是XOR或串联:
h(data1 XOR data2 XOR data3 XOR data4)?还是使用h(data3 1\x\{e76f}\{e76f}\\x{e76f}
发布于 2013-01-17 18:08:24
这实际上取决于您要做什么;散列函数是一个工具。就像锤子是好的,如果你想打钉子,而不是如果你想喂婴儿( 婴儿奶瓶是更好的)。
散列函数的一个主要用法是获取表示给定数据段的“摘要”。这是数字签名的第一步:我们实际上没有对数据进行签名,而是对数据的哈希进行签名;为了验证目的,哈希与原始数据一样好(因为您不能欺骗散列函数),但是哈希值有一个固定的、短的大小,更便于映射到签名算法使用的数学结构中。哈希函数的类似用法用于存储“验证令牌”,例如密码发生了什么:您存储密码的散列,以便当密码“返回”时,您可以验证它是否与您存储的内容匹配;但是,您所存储的内容不足以(轻松)重新计算密码。
显然,您希望散列一组数据元素:输入数据是一组由四个数据块组成的集合。
如果您的集合是有序的(您认为"data1、data2、data3、data4“与"data1、data2、data4、data3”不同),那么您应该使用连接,而不是XOR。在这个问题上,您可能希望散列一个稍微不那么含糊的编码,因为如果data1是"df“,而data2是"gh",那么级联就会产生"dfgh”,这与将"d“与"fgh”连接在一起所得到的值相同。如果您的数据元素是不包含逗号的字符串,则可以用逗号作为分隔符连接它们,这足以避免这种歧义。
如果您的集合是无序的(您认为"data1、data2、data3、data4“与"data1、data2、data4、data3”具有相同的含义,并且希望两者都散列到相同的值),那么XOR也不是正确的解决方案;您应该强制执行一个“排序步骤”,其中四个数据元素首先被明确地排序(例如字典顺序),然后按上面的顺序进行连接。
我不认为XORing会在这里做一些有用的事情,但也许您有一个用例,在这个用例中,XOR碰巧做了正确的事情。这真的取决于你想要实现什么。
发布于 2013-01-17 10:44:23
在您的示例中,XOR是一种对数据进行置乱的方法。哈希函数已经提供了很好的置乱功能,所以连接将提供更长的数据块,更好地抵御暴力攻击。
如果使用XOR,攻击者可以控制data1字段,则攻击者可以控制XOR操作的输出和结果哈希。一个例子是XOR-对攻击者控制的东西进行修改,比如时间戳。攻击者可以创建一个输入,以便控制XOR的输出,从而消除更改时间戳的影响。
发布于 2013-01-17 10:45:40
连接*:它将给您:
https://security.stackexchange.com/questions/29213
复制相似问题