首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >考虑唯一性和慢性的最佳散列算法是哪种算法?

考虑唯一性和慢性的最佳散列算法是哪种算法?
EN

Software Engineering用户
提问于 2016-09-15 19:59:29
回答 2查看 384关注 0票数 -3

我找不到答案,所以我们来试试.我考虑了一下安全性,得出的结论是,使用的散列算法应该尽可能慢,以减缓潜在的攻击者。(慢就像~1.5s)。我不想再次使用多个散列函数或相同的函数,我只想要一个慢的哈希函数。哦,慢一点不应该依赖于低效率的实现,而应该依赖于高复杂性。

编辑:不,不只是延迟。我想让一个可能的攻击者放慢脚步。

编辑2:假设攻击者不会像自定义IC那样在硬件中实现哈希。哈希函数的慢度应由哈希函数的数学复杂性决定。1.5只是一个数字,以防止奇怪的算法,实际上需要花费数小时的哈希。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-09-16 01:03:34

这些哈希有时被称为“密码哈希”,因为它们的设计正是为了防止您提到的威胁模型:有人获得了您的密码数据库的副本,并强行迫使它。子集也称为“基于密码的密钥派生函数(PBKDF)”。

氪星是一种相对较新的,但广为人知和广泛使用的算法,它的创建是为了修复更成熟的PBKDF2和bcrypt算法中的缺陷,这些算法可以通过自定义的ASIC或FPGA快速加速,并且很容易在GPU上并行化。

氪星的中心创新是一种非常大的伪随机位向量,它反过来又经常以伪随机的方式被访问。这意味着,改变代码的性能特性的标准“技巧”--时空权衡--在两个方面都是昂贵的。特别是,非常大的位向量使得算法很难并行化,因为您将有大量的计算元素破坏内存总线(限制并行加速比),或者在单个计算元素中复制非常大的位向量(使并行性昂贵)。伪随机访问模式还确保了分支预测、缓存预测、内存预取和这种减少缓存丢失的优化是无用的,并且位向量的大小确保了您将抛出的每个缓存都被抛出。

理论上,由于位向量和访问模式都是“仅”伪随机的,所以它们仍然是算法上确定的。

因此,您可以减少内存需求,只需动态计算所有内容,而不将位向量保存在内存中。然而,该算法的设计使得这个计算本身仍然非常缓慢,并且该算法被设计成一次又一次地访问相同的元素(但您无法轻易地预测何时和顺序),因此您将不得不一次又一次地重新计算元素。OTOH,您可以通过预先计算所有可能的值来减少时间需求,但是这样您就会得到内存需求的爆炸式增长。

无论哪种方式,代价都非常昂贵:您别无选择,只能使用大内存和大量的CPU周期。

基本上,你可以认为这两个伪随机序列是一个非常复杂的伪随机序列,而位向量则是一个缓存。但是,“缓存”的设计方式既不能删除它,也不能通过提高处理速度或并行性来弥补它,也不能扩展它,从而节省处理时间,并通过增加内存使用量来支付费用。

票数 1
EN

Software Engineering用户

发布于 2016-09-15 21:22:27

这就是像氪、bcrypt和pbkdf2这样的函子设计的目的。它们是资源密集型的,并将多个迭代组合在一起。迭代次数是一个可以调整的参数,以使算法尽可能慢。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/331179

复制
相关文章

相似问题

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