我一直在寻找,我找不到一个很好的资源,遍布整个实施Blowfish。
我正在使用5.3.8所以我知道我可以使用crypt()函数,并且我需要传递一个以
形式的盐$ 2 [x,y,a] $ [基数2日志的轮数] $ [some string]
但我在某处读到你需要每次都唯一地生成盐。这是否意味着您必须将盐存储在数据库中?如果有人窃取您的数据库,您是否处于与使用shaX相同的位置?这一切究竟是如何运作的。
ALSO
我一直在读Blowfish也用来解密密码。我理解它只是一个哈希算法,你加密两个字符串,然后检查它们是否匹配。您如何以及为何使用可以解密的算法?
答案 0 :(得分:1)
Salt可以保护您免受彩虹表攻击,因此可以将盐存储在同一个数据库中。
基本上,彩虹表是一个包含数百万个预先计算的哈希值的巨大表格。因此,如果密码为'some_pass'且散列为'ABC123',则攻击者会在他的彩虹表中查看'ABC123',他会看到'some_pass'正在生成此散列。
如果你使用salt,攻击者将拥有哈希和盐,但这个彩虹表不能工作。彩虹表包含常用密码和/或1-6(或更多)字符的所有组合。因此,如果您散列'some_pass_ salt _ _123123123123',您可以看到攻击者将无法获得彩虹表。
至于实施自己的Blowfish,我希望这是为了学习(作业?)。否则,实现自己的安全算法几乎总是一个坏主意,因为你不是领域专家,你会错过一些模糊的细节。
请注意,您可能还需要验证调用crypt()时实际使用的加密算法。 MD5不再安全,它可以用一个好的GPU打破(没有拼写错误,你可以使用你的显卡打破哈希)。 SHA-1已被破坏,但计算难度很大(军方可以做到);所以不建议使用SHA-1系列。瞄准SHA-2家族。