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