我最近遇到了一个系统,其中所有 DB 连接都由以各种方式隐藏的例程进行管理,包括 base 64 编码、md5sums 和各种其他技术。
为什么通过默默无闻的安全是一个坏主意?
我最近遇到了一个系统,其中所有 DB 连接都由以各种方式隐藏的例程进行管理,包括 base 64 编码、md5sums 和各种其他技术。
为什么通过默默无闻的安全是一个坏主意?
通过默默无闻的安全将把你的钱埋在一棵树下。唯一让它安全的是没有人知道它的存在。真正的安全是把它放在锁或密码后面,比如保险箱。你可以把保险箱放在街角,因为它的安全性在于除了你之外没有人能进去。
正如@ThomasPadron-McCarty 在下面的评论中提到的:
如果有人发现密码,您只需更改密码,这很容易。如果有人找到了这个位置,你需要把钱挖出来搬到别的地方,这是更多的工作。如果你在程序中使用隐蔽的安全性,你将不得不重写程序。
通过默默无闻的安全性可以说是不好的,因为它通常意味着默默无闻被用作主要的安全手段。在被发现之前,默默无闻是好的,但是一旦有人解决了你的特殊默默无闻,那么你的系统就会再次脆弱。鉴于攻击者的持续存在,这等同于根本没有安全性。
不应该使用模糊性来替代适当的安全技术。
作为隐藏源代码以防止复制的一种手段,晦涩难懂是另一个主题。我在这个话题上意见不一。我可以理解您为什么希望这样做,就我个人而言,我从未遇到过需要这样做的情况。
通过默默无闻的安全性是一个有趣的话题。它(正确地)被诽谤为有效安全的替代品。密码学的一个典型原则是消息是未知的,但内容是未知的。加密算法通常被广泛发布,由数学家分析,一段时间后,人们对它们的有效性建立了一些信心,但永远不能保证它们是有效的。
有些人隐藏了他们的加密算法,但这被认为是一种危险的做法,因为这样的算法没有经过同样的审查。只有像美国国家安全局这样拥有大量预算和数学家人员的组织才能摆脱这种方法。
近年来更有趣的发展之一是隐写术的风险,这种做法是将信息隐藏在图像、声音文件或其他介质中。隐写分析中最大的问题是识别消息是否存在,通过模糊来确保这种安全性。
去年我遇到了一个研究人员计算隐写通道容量的故事,但真正有趣的是:
以这种方式研究隐写通道会导致一些违反直觉的结果:例如,在某些情况下,将查找隐藏数据的算法数量增加一倍可以增加隐写通道的容量。
换句话说,您用于识别消息的算法越多,它变得越不有效,这与通过默默无闻对安全性的正常批评背道而驰。
有趣的东西。
这是一个坏主意的主要原因是它没有解决潜在的问题,只是试图隐藏它们。迟早会发现问题。
此外,额外的加密会产生额外的开销。
最后,过度模糊(如使用校验和)使维护成为一场噩梦。
更好的安全替代方案是消除代码中的潜在弱点,例如强制输入以防止注入攻击。
从安全漏洞中恢复的能力之一。如果有人发现您的密码,只需重置它。但是,如果有人发现了您晦涩难懂的计划,那您就完蛋了。
像所有这些人都同意的那样使用默默无闻不是安全,而是为自己争取时间。也就是说,实施一个体面的安全系统,然后添加一层额外的默默无闻仍然是有用的。假设明天有人在无法立即修补的 ssh 服务中发现了无与伦比的裂缝/漏洞。
作为一项规则,我已经在内部实现了......所有面向公众的服务器只公开所需的端口( http/https ),仅此而已。然后,一台面向公众的服务器将在某个不起眼的高编号端口处将 ssh 暴露给 Internet,并设置端口扫描触发器以阻止任何试图找到它的 IP。
默默无闻在安全世界中占有一席之地,但不是第一道和最后一道防线。在上面的示例中,我没有对 ssh 进行任何脚本/机器人攻击,因为他们不想花时间搜索非标准的 ssh 服务端口,如果他们这样做了,他们不太可能在另一层之前找到它安全人员介入并切断了他们。
所有可用的安全形式实际上都是通过默默无闻的安全形式。每种方法都增加了复杂性并提供了更好的安全性,但它们都依赖于某种算法和一个或多个密钥来恢复加密数据。当有人选择一种最简单、最容易破解的算法时,大多数人称之为“通过默默无闻实现安全”。
诸如字符转换之类的算法易于实现且易于破解,这就是为什么它们不是一个好主意。它可能总比没有好,但它最多只会阻止随意浏览数据以防止轻松阅读。
互联网上有很多优秀的资源,您可以使用这些资源来了解所有可用的加密方法及其优缺点。
安全是关于让人们进入或阻止他们,这取决于他们知道什么、他们是谁或他们拥有什么。目前,生物识别技术并不擅长找出你是谁,而且总是会出现问题(指纹读取器用于遇到严重事故的人,伪造指纹等)。因此,实际上,大部分安全性都是关于混淆某些东西。
良好的安全性是将您必须保密的东西保持在最低限度。如果你有一个正确加密的 AES 通道,你可以让坏人看到除了密码之外的一切,你就安全了。这意味着您有一个更小的区域可以被攻击,并且可以专注于保护密码。(并不是说那是微不足道的。)
为此,您必须对除密码之外的所有内容都充满信心。这通常意味着使用许多专家研究过的行业标准加密货币。任何人都可以创造一个他们无法破解的密码,但不是每个人都能创造出 Bruce Schneier 无法破解的密码。由于完全缺乏密码安全性的理论基础,密码的安全性取决于有很多非常聪明和知识渊博的人尝试提出攻击,即使它们不实用(对密码的攻击总是会变得更好) ,永远不会更糟)。这意味着加密算法需要广为人知。我对高级加密标准非常有信心,而乔编写和混淆的专有算法几乎没有。
但是,加密算法的实现存在问题。很容易在不经意间留下可以找到钥匙或进行其他恶作剧的孔。它发生在 PGP 的备用签名字段以及在 Debian Linux 上实现的 SSL 的弱点上。它甚至发生在 OpenBSD 上,它可能是现成的最安全的操作系统(我认为十年内最多有两次漏洞利用)。因此,这些应该由一家有信誉的公司来完成,如果实现是开源的,我会感觉更好。(封闭的源代码不会阻止一个坚定的攻击者,但它会让随机的好人更难找到要关闭的漏洞。)
因此,如果我想要安全,我会尽量让我的系统尽可能可靠,这意味着除了密码之外尽可能开放。
在已经安全的系统之上通过默默无闻的分层安全性可能会有所帮助,但如果系统是安全的,则没有必要,如果它不安全,最好的办法是使其安全。将默默无闻想象成不太知名的“替代医学”形式——它不太可能有太大帮助,虽然它本身不太可能造成太大伤害,但它可能会使患者不太可能去看有能力的医生或计算机安全专家,无论哪一个。
最后,作为一个感兴趣的读者,我想为Bruce Schneier 的博客制作一个完全不请自来且无私的插件。我从中学到了很多关于安全的知识。
评估、测试或改进安全产品的最佳方法之一是让一个庞大的、聪明的同行群体对它进行测试。
依靠“黑匣子”来保证安全性的产品无法从这种测试中受益。当然,作为“黑匣子”总是会引起怀疑(通常是有道理的),即他们无论如何都不会经受住这种审查。
我曾在一个案例中辩称,密码保护实际上是通过默默无闻实现的安全性。我能想到的唯一安全性不会是 STO 是某种生物识别安全性。
除了那一点语义和挑剔之外,STO(通过默默无闻的安全性)在任何需要真正安全的情况下显然都是不好的。但是,可能存在无关紧要的情况。我会经常异或填充一个我不想让任何人阅读的文本文件。但我真的不在乎他们是否这样做,我只是希望它不被阅读。在这种情况下,这无关紧要,XOR 垫是易于查找 STO 的完美示例。
这几乎从来都不是一个好主意。同理,开车不系安全带好不好?当然,您可以找到一些适合的情况,但是由于经验的原因,答案似乎很明显。
弱加密只会阻止最不积极的黑客,因此它并非毫无价值,只是不是很有价值,尤其是当 AES 等强加密可用时。
通过默默无闻的安全性是基于您很聪明而您的用户很愚蠢的假设。如果该假设是基于傲慢而不是经验数据,那么您的用户和黑客将确定如何调用隐藏方法、打开未链接的页面、反编译并从 .dll 中提取纯文本密码等。
也就是说,向用户提供全面的元数据并不是一个好主意,只要你用加密、授权、身份验证和所有其他安全原则来支持它,隐藏是完全有效的技术。
如果操作系统是 Windows,请考虑使用数据保护 API (DPAPI)。它不是默默无闻的安全性,并且是为无人参与的过程存储登录凭据的好方法。正如几乎每个人在这里所说的那样,通过默默无闻的安全性并不能为您提供太多保护。
我必须补充的一点尚未涉及,那就是互联网通过默默无闻粉碎安全的令人难以置信的能力。
正如一次又一次证明的那样,如果你唯一的防御是“没有人知道后门/漏洞/漏洞的存在”,那么只需要一个人偶然发现它,几分钟之内,数百人就会知道。第二天,几乎每个想知道的人都会。哎哟。