密码学不是魔术

2020-07-26 02:09:41

{标题:密码学不是魔术描述:密码经常被视为一门黑术,只有受膏的专家才能希望安全地使用。它不是。法律是有的,我们可以学习。}2020年7月密码不是魔术=。>;损坏的密码通常看起来可以正常工作。>;构建密码的最好方法是学习如何破解它。>;使用现有的、经过审查、审阅良好的库。>;把它留给专家吧。_Infosec的人们和他们的追随者。_现在流行的主题似乎是,密码学是一种黑魔法,最好留给受膏的高级祭司。如果不先成为那些自吹自擂的专家中的一员,我们这些凡人就不能指望安全地完成这一任务--对于我们这些知道自己所处位置的人来说,这是一项了不起的努力。虽然这是一个很好的一级近似,但这种把门在很多层面上都是有问题的。首先,现实世界中的一些人有当前密码系统不能总是满足的需求。用你不知道自己在做什么来侮辱他们是无济于事的。其次,它有几个反常的影响:-它阻止了许多理性的人研究这个课题。-它导致不太理性的人无论如何都会[冲锋在前](电抗)。-如果密码学是一门艺术,我们可以边走边编。发明牢不可破的密码,决不是。[电抗]:https://en.wikipedia.org/wiki/Reactance_(psychology)(电抗)我想提倡一种不同的方法。密码学有一些规则,这些规则比我们想象的更简单,也更基本。我们可以告诉人们他们不知道什么,并给他们一些指导:入门[书籍][C101]或[课程][Boneh],或者具体的单词和概念。在这里,我将概述您在推出自己的密码系统之前需要查找的内容。我已经确定了三大类:实现密码、设计协议和设计原语。[C101]:https://www.crypto101.io/[boneh]:https://crypto.stanford.edu/~dabo/courses/OnlineCrypto/_Note:这是一篇观点文章,所以让我澄清一下我来自哪里。我从2007年开始专业编程,4年前开始自学密码学。我编写了一个[密码库][Moncypher],最近的[审核][]没有发现重大缺陷。_[审核]:https://cure53.de/pentest-report_monocypher.pdf[monocypher]:https://monocypher.org/Implementing Crypto-可能令人惊讶的是,实现加密原语&;协议需要的密码知识很少。*选择实现什么更加微妙(您需要了解最新技术),但是一旦您做出了选择,您唯一担心的就是旁路和正确性。旁路有一条规则:不要让任何数据从秘密流向该通道。有趣的旁路包括定时、能耗、电磁辐射…。大多数时间都可以忽略(例如,能源消耗需要物理访问),但计时除外。永远不要忽略计时,它们是大多数威胁模型的一部分。在大多数CPU上,可以通过删除所有秘密依赖分支和所有秘密依赖索引来消除计时侧通道。一些CPU还具有可变时间的算术运算。特别要注意公式和变量式的移位,也要小心编译器和解释器。没有主流语言指定如何生成恒定时间代码,因此您的工具可以在源代码没有的地方插入秘密依赖分支。高级语言尤其倾向于使用可变时间算术。在实践中,像C这样的低级语言是相当合理的,但我认为[Exceptions][].[Exceptions]:https://github.com/LoupVaillant/Monocypher/issues/25#issuecomment-356270587Note指出,某些原语比其他原语更容易受到恒定时间软件实现的影响:在大多数平台上,Chacha20倾向于自然地不受计时攻击,而AES则需要特别注意,如果你没有硬件支持,那么我们就有了正确性。最轻微的错误都可能把密码保证抛到窗外,所以我们不能容忍错误。您的代码必须是无错误的,句号。这并不容易,但很简单:这一切都是关于测试和证明。#密码和散列的正确性密码和散列相当容易测试。他们的核心是接受一个输入,然后彻底地破坏它,以至于输入的最轻微的变化都会完全扰乱输出。在实践中,最轻微的编程错误往往会完全改变最终结果,您所要做的就是将原语的输出与引用实现或测试向量进行比较。理想情况下,对所有可能的输入和输出长度执行此操作。_包括零(空输入)_。实际上,您可以在最大的内部循环的两次迭代处停止,以确保命中所有数据路径。如果您有一个初始化-更新-最终接口,请尝试更新中所有可能的切断点,以确保获得相同的结果。I'