【发布时间】:2021-08-24 15:48:56
【问题描述】:
假设您有一些使用哈希函数的软件服务器,并且一些外部来源想要利用它,并且它不断使用他们知道(或很有可能)会导致冲突的密钥攻击服务器。您将如何在实践中防止这种情况发生?
我认为一种方法是在问题开始时随机选择散列函数,但这种方法似乎很慢,因为每次更改散列函数时都必须重新散列所有内容。
【问题讨论】:
假设您有一些使用哈希函数的软件服务器,并且一些外部来源想要利用它,并且它不断使用他们知道(或很有可能)会导致冲突的密钥攻击服务器。您将如何在实践中防止这种情况发生?
我认为一种方法是在问题开始时随机选择散列函数,但这种方法似乎很慢,因为每次更改散列函数时都必须重新散列所有内容。
【问题讨论】:
正如您显然意识到的那样,最好的防御方法是确保他们不知道您的哈希函数会产生什么 - 理想情况下也不知道您的桶数(如果哈希函数很强,难以逆转并产生大范围的输出——比如 64 位无符号整数——然后找到两个产生相同哈希的键可能很耗时,但是找到一个在修改 N 后将哈希到特定存储桶的值只需要平均 N 次尝试任意随机,不同的键)。
在问题开始时随机选择散列函数,但这种方法似乎很慢,因为每次更改散列函数都必须重新散列所有内容。
不一定需要反复更改哈希函数...您只需要根据公开的数据/代码和可观察的行为使其不可猜测。例如,您可能会在服务器上生成一个随机种子值,将其写入某个安全文件,并将其用作哈希函数的种子(或者如果您的哈希函数不支持种子值,只需对哈希进行异或输出随机值)。即使有人知道你的哈希函数,如果他们不知道种子,那么他们就无法设计碰撞。
您还可以计算特定客户端发生的冲突,如果显然是恶意的 - 断开它们并移除它们的密钥。
【讨论】: