首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列表非加密散列函数的种子

散列表非加密散列函数的种子
EN

Stack Overflow用户
提问于 2020-10-09 03:18:40
回答 1查看 425关注 0票数 1

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-11 03:40:07

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

在我自己的方法中,我使用了相同的散列函数,其中每个字符都与非线性混合的结果相加,依赖于uint32_t[256]的随机数组。数组是在系统初始化期间创建的,在我的代码中,它是通过读取/dev/urandom在每次启动时创建的。请看我在开源emerSSL程序中的实现。欢迎借用整个哈希表实现,或者仅使用哈希函数。

目前,我的散列函数来自参考来源,为double hashing搜索算法计算两个独立的散列。

有“简化的”哈希函数从源代码,以演示与S块阵列的非线性混合的想法“

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64269281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档