哈希表非加密哈希函数的种子

问题描述

如果将在调整大小或创建表期间将哈希表种子设置为随机数,是否可以防止对此类哈希表的DDoS攻击,或者知道哈希算法,攻击者仍将轻松地绕过种子?如果该算法对攻击者未知的随机生成的表使用Pearson哈希函数,该怎么办?这样的表哈希还需要种子还是足够安全?

上下文:我想为我的玩具Web服务器的键值数据库使用磁盘上的哈希表,其中的键可能取决于用户输入。

解决方法

有几种方法可以保护散列子系统免受“逆向选择”攻击,其中最流行的方法是命名为Universal Hashing,其中在初始化时会随机选择散列函数或其属性。

在我自己的方法中,我使用的是相同的哈希函数,其中每个字符通过非线性混合相加而得到uint32_t[256]随机数组的依赖项。数组是在系统初始化期间创建的,在我的代码中,数组是在每次启动时通过读取/dev/urandom来创建的。请参阅我在开源emerSSL程序中的实现。欢迎您使用整个哈希表实现或仅哈希函数。

目前,我从引荐来源获得的哈希函数为double hashing搜索算法计算了两个独立的哈希。

从源头上有“减少的”哈希函数,以演示与S块数组进行非线性混合的想法”

uint32_t S_block[0x100]; // Substitute block,random contains

#define NLF(h,c) (S_block[(unsigned char)(c + h)] ^ c)
#define ROL(x,n) (((x) << (n)) | ((x) >> (32 - (n))))

int32_t hash(const char *key) {
  uint32_t h = 0x1F351F35; // Barker code * 2
  char c;
  for(int i = 0; c = key[i]; i++) {
    h  = ROL(h,5);
    h += NLF(h,c);
  } 
  return h;
}