我可以分享我在公开报告中使用的密码哈希函数吗?

信息安全 密码 哈希
2021-09-05 04:15:03

我在实习期间开发了一个网站,使用带有帐户的数据库。我使用了crypt()PHP 的方法,带有安全算法和盐(在网上找到了很多反馈)。显然,我想在我的报告中讨论它,但是,由于该报告将被公开,这会是一个安全问题吗?

我认为这并不重要,因为该方法本身非常安全,但也许,如果攻击者知道该算法,它会使暴力破解变得更容易一些。

3个回答

你应该公开算法吗?

试图隐藏实现细节(例如您使用哪种散列算法)以保持安全性正是通过 obscurity安全性的定义人们普遍认为,默默无闻不应该是你唯一的防线。

如果您需要对哈希算法保密,那么您做错了,需要选择更好的哈希算法。当你使用一个好的算法时,没有理由不告诉全世界,因为他们无论如何都无法破解你的哈希值。

另请注意,在您的情况下,盐会将您送走。如果有人掌握了您的数据库,他们将能够从中读取使用的算法。因此,默默无闻并不会让暴力破解变得更加困难。然而,宣传一个弱方案可能会鼓励攻击者。一个强大的可能会产生相反的效果。迈克古德温在他的回答中提出的观点也应该被考虑在内。

crypt() 安全吗?

因此,要问的相关问题是是否crypt()足够安全。让我们看一下PHP 手册

password_hash()使用强哈希,生成强盐,并自动应用适当的轮次。password_hash()是一个简单的crypt()包装器,并且与现有的密码哈希兼容。password_hash()鼓励使用。

一些操作系统支持不止一种类型的哈希。事实上,有时标准的基于 DES 的算法会被基于 MD5 的算法所取代。

基于标准的 DEScrypt()将盐值作为输出的前两个字符返回。它也只使用 的前八个字符str,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。

该函数使用不同的算法,具体取决于您格式化盐的方式。一些算法非常弱,而强算法可能并非在所有系统上都可用。因此,根据所使用的算法,这里存在许多问题:

  • 对于某些算法crypt()仅应用一轮散列。这太快了,并且将启用蛮力攻击。
  • 在某些情况下crypt()会使用已知较弱的MD5。
  • 只使用前八个字符就完全抵消了长密码的好处。

因此,我建议您切换到password_hash(). 它允许您使用 bcrypt - 一种久经考验的算法。然后,您可以自豪地向全世界介绍您的哈希方案。

@Anders 是正确的,通过默默无闻的安全性根本就没有安全性。

话虽如此,发布实现细节会为攻击者提供信息,如果将来在您的实现中发现漏洞,或者攻击者有零日漏洞,他们可以使用这些信息。

可以这样想——许多渗透测试从发现正在使用的协议、技术和版本的侦察阶段开始。然后,此信息将用于尝试已知的漏洞(如果有)。

如果这种信息对渗透测试人员有用,那么它对攻击者也很有用。为什么要通过为他们做部分工作来让他们的生活更轻松?在所有其他条件相同的情况下,他们可能会专注于让他们更轻松的系统,而不是让他们更努力地工作的系统。

总的来说,除非发布技术细节对您或您的雇主有明显的好处,否则我会保密。在需要知道的基础上工作。

只是重复一遍,以避免投票 - 我完全同意通过默默无闻的安全性根本不是安全性;-p

你不仅可以,你绝对应该

Kerckhoff 的原则规定,系统安全性的唯一有效依据是密钥,并且任何安全系统的设计都应考虑到“敌人知道系统”的概念,即预先假定为真实的。

因此,根据 Kerckhoff 的原则,共享系统的详细信息不会降低系统的安全性,因为您必须预先假设敌人已经知道系统,因为坏人愿意入侵并进行间谍活动以获得访问权限到它的工作原理。然而,共享可以做的是通过与能够分析和审查它的好人、专家共享它来帮助使您的系统更加安全。如果有漏洞,好人和坏人都会找到它们,但坏人不会与您分享,因此您可以修复它们。

因此,如果您希望您的系统是安全的,您不能不分享它的工作原理。