我在实习期间开发了一个网站,使用带有帐户的数据库。我使用了crypt()
PHP 的方法,带有安全算法和盐(在网上找到了很多反馈)。显然,我想在我的报告中讨论它,但是,由于该报告将被公开,这会是一个安全问题吗?
我认为这并不重要,因为该方法本身非常安全,但也许,如果攻击者知道该算法,它会使暴力破解变得更容易一些。
我在实习期间开发了一个网站,使用带有帐户的数据库。我使用了crypt()
PHP 的方法,带有安全算法和盐(在网上找到了很多反馈)。显然,我想在我的报告中讨论它,但是,由于该报告将被公开,这会是一个安全问题吗?
我认为这并不重要,因为该方法本身非常安全,但也许,如果攻击者知道该算法,它会使暴力破解变得更容易一些。
试图隐藏实现细节(例如您使用哪种散列算法)以保持安全性正是通过 obscurity对安全性的定义。人们普遍认为,默默无闻不应该是你唯一的防线。
如果您需要对哈希算法保密,那么您做错了,需要选择更好的哈希算法。当你使用一个好的算法时,没有理由不告诉全世界,因为他们无论如何都无法破解你的哈希值。
另请注意,在您的情况下,盐会将您送走。如果有人掌握了您的数据库,他们将能够从中读取使用的算法。因此,默默无闻并不会让暴力破解变得更加困难。然而,宣传一个弱方案可能会鼓励攻击者。一个强大的可能会产生相反的效果。迈克古德温在他的回答中提出的观点也应该被考虑在内。
因此,要问的相关问题是是否crypt()
足够安全。让我们看一下PHP 手册:
password_hash()
使用强哈希,生成强盐,并自动应用适当的轮次。password_hash()
是一个简单的crypt()
包装器,并且与现有的密码哈希兼容。password_hash()
鼓励使用。一些操作系统支持不止一种类型的哈希。事实上,有时标准的基于 DES 的算法会被基于 MD5 的算法所取代。
基于标准的 DES
crypt()
将盐值作为输出的前两个字符返回。它也只使用 的前八个字符str
,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。
该函数使用不同的算法,具体取决于您格式化盐的方式。一些算法非常弱,而强算法可能并非在所有系统上都可用。因此,根据所使用的算法,这里存在许多问题:
crypt()
仅应用一轮散列。这太快了,并且将启用蛮力攻击。crypt()
会使用已知较弱的MD5。因此,我建议您切换到password_hash()
. 它允许您使用 bcrypt - 一种久经考验的算法。然后,您可以自豪地向全世界介绍您的哈希方案。
@Anders 是正确的,通过默默无闻的安全性根本就没有安全性。
话虽如此,发布实现细节会为攻击者提供信息,如果将来在您的实现中发现漏洞,或者攻击者有零日漏洞,他们可以使用这些信息。
可以这样想——许多渗透测试从发现正在使用的协议、技术和版本的侦察阶段开始。然后,此信息将用于尝试已知的漏洞(如果有)。
如果这种信息对渗透测试人员有用,那么它对攻击者也很有用。为什么要通过为他们做部分工作来让他们的生活更轻松?在所有其他条件相同的情况下,他们可能会专注于让他们更轻松的系统,而不是让他们更努力地工作的系统。
总的来说,除非发布技术细节对您或您的雇主有明显的好处,否则我会保密。在需要知道的基础上工作。
只是重复一遍,以避免投票 - 我完全同意通过默默无闻的安全性根本不是安全性;-p
你不仅可以,你绝对应该。
Kerckhoff 的原则规定,系统安全性的唯一有效依据是密钥,并且任何安全系统的设计都应考虑到“敌人知道系统”的概念,即预先假定为真实的。
因此,根据 Kerckhoff 的原则,共享系统的详细信息不会降低系统的安全性,因为您必须预先假设敌人已经知道系统,因为坏人愿意入侵并进行间谍活动以获得访问权限到它的工作原理。然而,共享可以做的是通过与能够分析和审查它的好人、专家共享它来帮助使您的系统更加安全。如果有漏洞,好人和坏人都会找到它们,但坏人不会与您分享,因此您可以修复它们。
因此,如果您希望您的系统是安全的,您不能不分享它的工作原理。