我找不到答案,所以我们来试试.我考虑了一下安全性,得出的结论是,使用的散列算法应该尽可能慢,以减缓潜在的攻击者。(慢就像~1.5s)。我不想再次使用多个散列函数或相同的函数,我只想要一个慢的哈希函数。哦,慢一点不应该依赖于低效率的实现,而应该依赖于高复杂性。
编辑:不,不只是延迟。我想让一个可能的攻击者放慢脚步。
编辑2:假设攻击者不会像自定义IC那样在硬件中实现哈希。哈希函数的慢度应由哈希函数的数学复杂性决定。1.5只是一个数字,以防止奇怪的算法,实际上需要花费数小时的哈希。
发布于 2016-09-16 01:03:34
这些哈希有时被称为“密码哈希”,因为它们的设计正是为了防止您提到的威胁模型:有人获得了您的密码数据库的副本,并强行迫使它。子集也称为“基于密码的密钥派生函数(PBKDF)”。
氪星是一种相对较新的,但广为人知和广泛使用的算法,它的创建是为了修复更成熟的PBKDF2和bcrypt算法中的缺陷,这些算法可以通过自定义的ASIC或FPGA快速加速,并且很容易在GPU上并行化。
氪星的中心创新是一种非常大的伪随机位向量,它反过来又经常以伪随机的方式被访问。这意味着,改变代码的性能特性的标准“技巧”--时空权衡--在两个方面都是昂贵的。特别是,非常大的位向量使得算法很难并行化,因为您将有大量的计算元素破坏内存总线(限制并行加速比),或者在单个计算元素中复制非常大的位向量(使并行性昂贵)。伪随机访问模式还确保了分支预测、缓存预测、内存预取和这种减少缓存丢失的优化是无用的,并且位向量的大小确保了您将抛出的每个缓存都被抛出。
理论上,由于位向量和访问模式都是“仅”伪随机的,所以它们仍然是算法上确定的。
因此,您可以减少内存需求,只需动态计算所有内容,而不将位向量保存在内存中。然而,该算法的设计使得这个计算本身仍然非常缓慢,并且该算法被设计成一次又一次地访问相同的元素(但您无法轻易地预测何时和顺序),因此您将不得不一次又一次地重新计算元素。OTOH,您可以通过预先计算所有可能的值来减少时间需求,但是这样您就会得到内存需求的爆炸式增长。
无论哪种方式,代价都非常昂贵:您别无选择,只能使用大内存和大量的CPU周期。
基本上,你可以认为这两个伪随机序列是一个非常复杂的伪随机序列,而位向量则是一个缓存。但是,“缓存”的设计方式既不能删除它,也不能通过提高处理速度或并行性来弥补它,也不能扩展它,从而节省处理时间,并通过增加内存使用量来支付费用。
发布于 2016-09-15 21:22:27
这就是像氪、bcrypt和pbkdf2这样的函子设计的目的。它们是资源密集型的,并将多个迭代组合在一起。迭代次数是一个可以调整的参数,以使算法尽可能慢。
https://softwareengineering.stackexchange.com/questions/331179
复制相似问题