【问题标题】:How exactly to implement Blowfish in php究竟如何在 php 中实现 Blowfish
【发布时间】:2012-10-27 17:29:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 盐只是为了防止预计算表(又名彩虹表)攻击。 PHP 5.5 将支持一个简单的 API,用于处理具有良好默认值的散列密码。如果您使用的是 PHP 5.3.7+,我建议使用 compat lib
  • "您如何以及为什么要使用可以解密的算法?"散列!=加密。散列是一种方法。
  • 另见:thisthis

标签: php encryption blowfish


【解决方案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 系列。

【讨论】:

    猜你喜欢
    • 2014-10-11
    • 2021-07-08
    • 2021-01-06
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多