0

我四处搜索,但找不到一个很好的资源来介绍整个 Blowfish 的实现过程。

我使用的是 5.3.8,所以我知道我可以使用 crypt() 函数,并且我需要向它传递一个盐,形式为

$2[x,y,a]$[base 2 log of rounds]$[some string]

但是我在某处读到,您每次都需要唯一地生成盐。这是否意味着您必须将盐存储在数据库中?如果有人窃取了您的数据库,您与使用 shaX 的情况不同吗?所有这些到底是如何工作的。

我一直在阅读 Blowfish 也用于解密密码。我理解它只是一种散列算法,您可以在其中加密两个字符串,然后检查它们是否匹配。您如何以及为什么要使用可以解密的算法?

4

1 回答 1

1

Salt 可以保护您免受彩虹表攻击,因此可以将 salt 存储在同一个数据库中。

本质上,彩虹表是一个包含数百万个预先计算的哈希值的巨大表。因此,如果密码是“some_pass”并且散列是“ABC123”,攻击者会在他的彩虹表中查看“ABC123”,他会看到“some_pass”正在生成这个散列。

如果你使用 salt,攻击者将拥有 hash 和 salt,但这个彩虹表无法工作。彩虹表包含通用密码和/或 1-6 个(或更多)字符的所有组合。所以如果你散列'some_pass_ salt_ _123123123123',你可以看到攻击者不会有彩虹表的运气。

至于实现自己的 Blowfish,我希望这是为了学习(家庭作业?)。否则,实现自己的安全算法几乎总是一个坏主意,因为你不是领域专家,你会错过一些晦涩的细节。

请注意,您可能还想验证调用 crypt() 时实际使用的加密算法。MD5 不再安全,它可以用一个好的 GPU 来破解(没有错字,你可以使用你的显卡来破解哈希)。SHA-1 已被破坏,但计算上很难做到(军方可以做到);所以不推荐使用 SHA-1 系列。瞄准 SHA-2 系列。

于 2012-10-27T17:35:41.890 回答