算法的保密性有多重要?

信息安全 密码学 密码 逆向工程 朦胧 理论
2021-08-30 13:58:06

从表面上看,通过隐蔽性来保证安全的不可取性与共享秘密(即“密码”)的概念直接不一致。也就是说:如果密码的保密是有价值的,那么通过扩展,保护使用密码的算法也一定是有价值的。许多(可以说是被误导的)组织甚至可能会说系统就是密码。

但是算法的保密性可以依赖到什么程度呢?或者更恰当地说,算法的保密性以何种方式注定要失败,而密码的保密性则不然?

另一方面,如果算法的保密性是可取的,那么它有多重要?开发人员应该在多大程度上合理地保守他的加密货币秘密?

编辑
需要明确的是,这不是关于创建一个新的、未经测试的算法,而是对您选择的算法的细节保密。例如,Windows 用来散列密码的技术是按未发布的序列应用已知的散列算法,并且似乎在不同版本的 Windows 之间发生变化。

4个回答

密码和密钥的大部分工作都与控制它们的存储和复制位置有关。

  • 密码存储在人类用户的脑海中它在键盘(或等效设备)上输入,并在处理时通过 CPU 的寄存器和计算机的 RAM。除非犯了一些可怕的错误,否则密码永远不会到达像硬盘这样的永久存储区域。

  • 算法作为源代码存在于某处,在开发人员的机器上、源版本控制系统和备份中。有一些设计文件,已经展示给不同的人(例如那些决定是否资助系统开发的人),并且经常被忽视地存放在典型桌面上某层外壳的匿名架子上。更重要的是,该算法还作为一些可执行文件存在于部署的系统本身上;二进制不像源代码那样可读,但逆向工程仍然有效

因此,我们不能合理地认为该算法是秘密的,或者至少与密码(或密钥)一样秘密。

确实,密码学方法在一个世纪前被拆分为算法密钥,正是因为如此:在一个正常运行的系统中,部分方法必然会到处泄漏痕迹。拥有密钥意味着将秘密集中在另一半,即我们可以保密的部分。


“通过默默无闻的安全”是一个使用术语默默无闻的表达方式,而不是保密性密码学是关于通过保密来实现安全性这就是全部区别:密码可以是秘密的;算法充其量是晦涩难懂的一旦某个聪明人想到带一个隐喻的灯笼,默默无闻就被驱散了。保密更像是一个钢铁保险箱:要突破它,你需要更强大的工具。

聪明人Auguste Kerckhoffs已经在一个多世纪前写了它。尽管发明了计算机和今天的所有技术,他的发现仍然适用。密码学从业者花了一段时间才学会了这一课。60 年后,德国人仍在对Enigma 机器的设计“保密” 。请注意,当德国人将 4 旋翼海军谜团投入使用时,盟军的密码学家们感到不便(例行破解停止了几个月),但并没有完全感到困惑,因为前一年的一些捕获的文件暗示了新版本的开发,其中第四个“反射器”转子。你有它:算法保密在实践中无法实现。


另一个转折是算法晦涩难懂会损害安全性我在上面解释的是,在安全性方面不能信任模糊性:它可能会增加安全性,但不会增加太多(而且你无法真正知道“多少”)。事实证明,它也会降低安全性。问题如下:制定安全的密码算法非常困难。唯一已知的方法是发布该算法,并等待世界各地密码学家的集体智慧来啃它并得出一个结论,该结论可以表示为“可以那样破解”或“显然很健壮”。算法被宣布为“好”

互联网、学术拖延和人类狂妄自大,通过正确的沟通活动,你可以让这几百名密码学家免费完成这项艰巨的评估工作——前提是你将算法公开(并以某种方式“有吸引力” )。如果您想保持算法晦涩难懂,那么您无法从这种免费咨询中受益。相反,您必须付费。二十位优秀的密码学家,比如说,两年的努力:我们在这里谈论的是数百万美元。没人这样做,太贵了。相应地,晦涩的算法总是比公共算法的压力测试少得多,因此安全性较低。

(注意小字:安全性不仅是关于不被破坏,而且是关于不会发生破坏的先验知识。我希望能够在晚上睡觉。)


概括:

  • 不应该对你的算法保密。
  • 不知道你的算法有多少是秘密的。
  • 不能对你的算法保密。
  • 但是您可以而且必须将密码保密,并且您可以知道它是“多少”秘密(这就是所有“熵”业务)。

保守你的加密货币秘密是不可行的。你需要把它放在那里,如果它真的有效,人们可以测试它。我看不出有任何理由对加密货币保密。您可以在门上放一把锁,每个人都可以看到您的锁,每个人都知道您的锁是如何工作的,并且知道没有钥匙它是无用的。密码就是你的钥匙。

除此之外,还有一些黄金法则,例如“不要重新发明轮子”和“不要尝试创建自己的加密货币”。我们有加密标准,因为他们可以大规模测试它。进一步参考Kerckhoffs 原理

算法与密码/密钥之间有两个重要区别:

  1. 您可以(并且应该)定期更改加密密钥 - 或者在怀疑存在妥协时。这减轻了保密性的损失。同样,当您有理由怀疑密码可能被泄露时,您应该更改密码。相比之下,及时更改使用的加密算法几乎是不可行的,因此您必须能够在算法已知的情况下生存(不失去安全性)。

  2. 每个可以加密或解密的软件都包含该算法的副本。这意味着只需要一名软件用户对算法进行逆向工程并将其发布到互联网上,算法就不再是秘密了。换句话说,你不能合理地期望对算法保密。相反,您的密码或加密密钥仅存储在您的机器上,而不是数百万其他用户的机器上。

早在 1883 年,Auguste Kerckhoffs 就阐明了这些原因——是的,一个多世纪以前。(看来那些人不是傻瓜!)请参阅维基百科上的 Kerckhoff 原理,尤其是规则 2(“[算法] 不得要求保密,并且必须能够毫无不便地落入敌人手中”) .

我还建议您在此处阅读有关“通过默默无闻的安全性”的其他问题,例如,包括如何定义安全要求以确保开发人员...不通过默默无闻提供安全性?默默无闻的有效作用证明通过默默无闻的安全性如何失效NSA Suite A Cryptography: Security through obscurity? 隐藏版本 - 有价值或只是默默无闻的安全?. 它们涵盖了相关的主题和理由。请记住使用搜索栏 - 或查看右侧的“相关”侧边栏。

只有少数几个好的算法,而可能有 10 40个 20 个字符或更少字符的好密码。因此,攻击者很容易猜出您的算法或枚举所有可能的算法,而他们不可能使用精心选择的密码来做同样的事情。想象一下,如果用户必须从十种可能性的列表中选择他们的密码,而且每个人的密码都是一样的——这基本上就是算法的位置。