不是所有的安全都“通过默默无闻”吗?

信息安全 朦胧
2021-08-09 16:29:03

我知道人们不应该依靠“默默无闻”来保障他们的安全。例如,选择非标准端口并不是真正的安全性,但这样做通常也没有什么坏处(并且可能有助于减轻一些最微不足道的攻击)。

散列和加密依赖于强随机化和密钥。例如,RSA 依赖于 的保密性d,并且通过扩展,pqϕ(N). 既然这些都必须保密,难道不是所有的加密(和散列,如果你知道随机化向量)都是通过默默无闻来安全的吗?如果不是,那么掩盖秘诀和只保守秘密之间的区别是什么?我们称(适当的)加密安全的原因是因为数学是无可辩驳的:例如,很难计算Npq(据我们所知)的因素。但这只是真实的,因为p并且q不为人所知。他们基本上是模糊的。

我读过The valid role of obscurity在什么时候可以算作“通过默默无闻的安全”?,而我的问题是不同的,因为我不是在问模糊性如何有效,或者在光谱中什么时候方案变得模糊,而是我问的是,即使我们定义了隐藏我们所有的秘密东西本身是否也不是晦涩难懂的我们的安全将通过这种机制来实现。为了澄清我的意思,后一个问题的答案(顺便说一句,很好)似乎停在“......他们仍然需要破解密码”——这意味着密码仍然对攻击者不可见。

4个回答

看到这个答案

主要的一点是,我们在默默无闻保密之间做出了明确的区分如果我们必须将差异缩小到单个属性,那么这必须是可测量性。外人不知道的东西是秘密的,我们知道这些外人不知道的有多少例如,一个 128 位对称密钥是一个 128 位序列,因此所有 2 128个可能的序列都具有相同的被使用概率,因此试图猜测这样一个密钥的攻击者平均需要尝试在击中正确的之前至少有 2 127个。那是定量的。我们可以做数学、加数字和计算攻击成本

这同样适用于 RSA 私钥。数学更复杂,因为最有效的已知方法依赖于整数分解,并且所涉及的算法不像对称密钥上的蛮力那样容易量化(有很多关于 RAM 使用和并行性或缺乏的细节)。但这仍然是保密的。

相比之下,一个晦涩的算法只有在攻击者没有弄清楚算法细节的情况下才是“秘密”的,这取决于很多因素:实现算法的硬件的可访问性、逆向工程的技能和智能我们没有一个有用的方法来衡量一个人有多聪明。所以秘密算法不能是“秘密的”。我们有另一个术语,那就是“晦涩难懂”。

我们希望通过保密来实现安全,因为安全就是风险管理:我们接受使用安全系统的开销,因为我们可以衡量使用它的成本,以及它降低了成功攻击的风险多少,然后我们可以平衡成本以做出明智的决定。这可能只是因为我们可以对成功攻击的风险进行数字化,而这只能在保密的情况下完成,而不是在默默无闻的情况下。

我认为“通过默默无闻的安全”这个词经常被滥用。

在谈论隐蔽性安全时,最常提到的引语是Kerckhoffs 原则

绝不能要求保密,而且要能够落入敌人手中而不会造成不便;

通过默默无闻的安全性是指依靠通过向攻击者隐藏细节来保持安全系统的设计实施安全。这不是很可靠,因为只要有足够的时间,系统和协议就可以被逆向工程和拆开。此外,依赖于隐藏其实现的系统不能依赖于专家检查它的弱点,这可能会导致比已经检查过的系统更多的安全漏洞,并且已知并修复错误。

以 RSA 为例。世界上每个人都知道它是如何工作的。好吧,无论如何,每个对数学有很好掌握的人。它经过深入研究并依赖于困难的数学问题。然而,鉴于我们对所涉及的数学的了解,只要 的值p和保密,它就是安全的q这实质上是将破坏(和保护)系统的工作集中在一个可以保护的秘密中。

将此与不符合 Kerckhoffs 原则的加密算法进行比较。这种加密算法不是使用使用密钥的公知方案,而是保密的。任何知道该算法的人都可以解密使用该算法加密的任何数据。很难保证,因为算法几乎不可能落入敌人手中。有关这方面的一个很好的例子,请参阅Enigma 机器。

安全就是保守秘密,但好的安全在于知道哪些秘密可以保留,哪些不能。

尤其是,最好的安全协议是围绕将秘密从设计中分解出来的原则构建的,这样您的秘密就可以得到保密,而不必同时对设计保密。这一点尤其重要,因为众所周知,系统设计不可能保密。这是Kerckhoffs 原理的核心,它可以追溯到老式军用密码机的设计。

换句话说,如果你的算法你的秘密,那么任何看到你算法实现的人——任何拥有你的硬件的人,任何拥有你的软件的人,任何使用你的服务的人——都会看到你的秘密。算法是存放秘密的好地方,因为算法容易检查。此外,如果不更改您的实现,就无法更改嵌入到设计中的秘密。你永远被同一个秘密所困。

但是,如果您的机器不需要保密,如果您设计的系统使秘密独立于机器——一些密钥或密码——那么即使在检查了设备之后,您的系统也将保持安全被您的敌人、黑客、客户等攻击。这样您就可以将注意力集中在保护密码上,同时对没有密码就不会破坏您的系统充满信心。

关键的区别在于保密的内容。

以 RSA 为例。RSA 的核心原理是简单的数学运算。任何有一点数学知识的人都可以弄清楚 RSA 在功能上是如何工作的(数学几乎有半个千年的历史了)。需要更多的想象力和经验才能弄清楚如何利用它来实现安全性,但它至少已经独立完成了两次(由 Rivest、Shamir 和 Adleman 完成,几年前由Clifford Cocks完成)。如果您设计了类似 RSA 的东西并对其保密,那么其他人很有可能会足够聪明地弄清楚它。

另一方面,私钥是随机生成的。如果正确完成,随机生成可确保无法用人类可用的计算能力重建秘密。再多的聪明也不会允许任何人重建一个随机位的秘密字符串,因为该字符串没有直觉的结构。

密码算法是出于聪明而发明的,具有很大程度上共同的目标(保护一些数据,廉价地实施算法,......)。聪明的人很有可能会采用相同的算法。另一方面,秘密位的随机字符串很多,根据定义,人们不会想出相同的随机字符串¹。因此,如果您设计自己的算法,您的邻居很有可能也会设计相同的算法。如果你和你的朋友分享你的算法,然后想和他私下交流,你需要一个新的算法。但是,如果您生成密钥,它将与您的邻居和您的伙伴的不同。将随机密钥保密肯定有潜在价值,而对算法保密则不然。

关于密钥保密的第二点是它可以被测量。使用好的随机生成器,如果您生成一个随机的 n 位字符串并将其保密,那么其他人一次尝试就可以找到它的概率是 1/2^n。如果您设计一种算法,则无法衡量其他人发现它的风险。

RSA 私钥不是一个简单的随机字符串——它们确实有一些结构,是一对素数。然而,熵的数量——一定大小的可能 RSA 密钥的数量——大到足以使一个几乎无法猜测。(至于 RSA 密钥实际上不可能从公钥和一堆明文和密文中重建,这是我们无法从数学上证明的事情,但我们相信是这样,因为很多聪明人都尝试过但都失败了。但那是另一个故事。)

当然,这可以推广到任何密码算法。将随机字符串保密。发布巧妙的设计。

这并不是说一切都应该公开,除了一小部分是随机的比特。Kerckhoff 的原则并没有这么说——它说设计的安全性不应该依赖于设计的保密性。虽然密码算法最好发布(你应该等待十年左右才能使用它们,看看是否有足够多的人没有破解它们),还有其他最好保密的安全措施,特别是需要主动探测的安全措施弄清楚。例如,一些防火墙规则可以属于这一类;但是,如果防火墙不能针对知道规则的攻击者提供保护,那将是无用的,因为最终有人会弄清楚它们。

¹虽然从数学上讲这不是真的,但您确实可以打赌。