确定性的哈希函数,仍然有一个工作因素(类似于bcryptscrypt)。

问题描述 投票:0回答:1

我需要生成一个哈希,并将受益于像bcrypt这样的内置工作因子的算法。问题是我需要这个散列是确定性的,而bcrypt算法的一部分是从随机字节中生成一个动态盐,产生一个非确定性的输出散列。这对于标准密码的使用情况显然是完全没有问题的,但是我有一个不同的情况,就是慢速散列,这就不适合了。

我用两种方法修改了算法,这两种方法都能完全满足我的需求,但我有点紧张,因为我打开了一个潜在的漏洞。我潜在的错误假设是,bcrypt算法中生成的动态盐只是作为一种方便,因为人们使用bcrypt的主要原因是为了生成密码,他们只是帮助算法的用户避免因为没有盐而射中自己,容易受到彩虹表查询等情况的影响。在我的特殊情况下,我没有这个需求。

所以我的2个解决方案,都很好用,分别是

1.)只是让盐的生成使用固定的16个字节,而不是生成16个随机字节。输出的哈希值是确定的,我仍然可以在生成盐的时候提供一个工作因子。

2.) 让salt生成器接受一个字符串,用来生成一个16字节的确定性输出哈希(我不知道是否需要16字节,我只是不想搞乱接口)。输出哈希是确定性的,我仍然可以提供一个工作因子,以及一个输入字符串作为盐。

这两种方法都能很好地服务于我的用例,而且我不认为它们有什么问题,但是如果你碰巧对此有更深入的了解,我会感谢你的投入。

hash cryptography passwords bcrypt scrypt
1个回答
0
投票

值得一提的是,该算法似乎并不依赖于随机生成的盐。这并不意味着你不应该使用盐。

我在这里实现了这一点。https:/github.comralusekbcrypt-deterministic...

它允许你提供自己的任意字符串作为盐。它要做的是用SHA512对你提供的字符串进行哈希处理,然后截断前16个字节作为盐,而不是随机的16个字节。如果没有提供任何盐,它就会回到使用随机字节。这允许对给定的盐+数据组合进行确定性的输出。

© www.soinside.com 2019 - 2024. All rights reserved.