如何作为程序员学习密码学

2020-06-10 12:43:57

我当然可以告诉每个人我作为一名自学成才的程序员的历史,当我的独立游戏项目的网站不断遭到黑客攻击后,我发现了密码学,我被介绍给了密码散列函数…。但我怀疑人们想要回答的问题是,“你如何推荐我学习密码学?”而不是我关于实现不佳的密码散列是网关漏洞的警示故事。

如果你想要一本书来增加你在传统道路上的旅程,我推荐让-菲利普·奥马森(Jean-Philippe Aumasson)的“严肃密码学”(Serious Cryptoology)。

传统的学习密码学的学术方式涉及到大量的自学,如数论、线性代数、离散数学、概率论、排列和场论。

您通常会从经典密码(凯撒等)开始。然后通读密码学的历史,直到你最终了解了支撑rsa和迪菲-赫尔曼的数学知识,可能还讲授了施奈尔定律,并告诫只能使用aes和sha-2…。然后,除非你攻读密码学学位,否则你只能自行其是。

人们漫不经心地探索这条道路的最终结果是很多设计,比如Telegram的MTProto,它们用奇异的分组密码模式做蠢事,滥用普通的密码散列函数作为消息验证码;通常是使用教科书。未填充的RSA、ECB中的AES、CBC或作者必须编写自定义代码才能处理的某种很少使用的模式(在幕后使用ECB模式),以及(直到最近)SHA-1。

决定将密码学作为一门严肃的学术学科来研究的人不会犯这些错误。他们太容易犯常见的错误了。取而代之的是,他们面临着花费数年时间从事关于同态加密、密码配对和其他酷东西的深奥研究的风险,这些东西可能在五年或更长时间内看不到现实世界的部署(在新的加密货币爱好项目之外)。

这就是说:学术是一条有效的道路,但并不是每个人都适合。

学习密码学的另一种传统方法是打破现有的密码学实现。这并不总是像听起来那么困难:通过反向工程来击败反作弊保护的视频游戏已经让我的几个朋友学习了密码学。

对于注重安全的人们来说,最好的起点是CryptoPals挑战赛。另一种选择是CryptoHack。

一年四季也有大量的CTF活动,但除了CryptoPals提供的活动之外,它们很少是一个很好的密码学学习练习。(尽管也有值得注意的例外。)。

如果你有计算机编程背景,想学习密码学,那么传统的方法可能会带来乐高推理的风险。

相反,我建议的方法是开始积累最安全、最高级别的库的经验,然后慢慢了解细节。

如果你必须在你还在学习的时候实现一些东西,你的知识和经验就是“使用安全可靠的东西”,而不是“在ECB模式下用Blowfish和MD5破解一些东西,因为它们是熟悉的”。

你可以让自己的好奇心指导你的教育,而不是跟随别人的学习指导。

为了说明这是什么样子,下面是JavaScript开发人员学习密码学的方法,从最简单的模式库开始,深入到细节。

dhole Crypto是一个开源库,用JavaScript和PHP实现,由libNa提供支持,它试图使安全性尽可能简单。

我设计Dhole Crypto是为了保护我自己的项目,而不会增加任何审阅我代码的人的认知负担。

如果您是一名经验丰富的程序员,您应该能够在Node.js/PHP项目中成功使用Dhole Crypto。如果它来之不易,这是一个应该立即修复的错误。

使用LibNa比Dhole Crypto稍微复杂一些:现在你必须知道什么是随机数,并小心地管理它们。

利巴纳仍然相当容易。如果你使用这个小抄,你可以不费多少力气就能实现一些安全的东西。如果您偏离了小抄,请仔细注意文档。

如果您正在编写系统软件(即用C语言编程),那么libNa是一个非常易于使用的库。

假设您正在从事的项目中libNa被过度使用,并且您只需要几个密码原语和构造(例如,XChaCha20-Poly1305)。一个很好的例子是:浏览器内JavaScript。

您可以选择使用这些原语的JavaScript实现来实现兼容的构造,而不是强迫用户下载整个Sodium库。

因为您有可信的实现来测试您的构建,所以这应该是一个风险相对较低的工作(假设原始实现也是安全的),但是如果没有所有先前的经验,就不应该进行这项工作。

一旦你实现了协议和结构,你自我教育的下一步就是设计新的协议和结构。

也许您想将XChaCha20与基于BLAKE3散列函数的MAC相结合,并使用某种SIV来使整个Shebang随机数不会被误用?

如果没有所有先前的经验,您不会想要一头扎进密码协议/结构设计。

与其说密码原语很难实现,不如说它很难实现。在他们将字符限制提高到280之前,你可以在一条推文中加入RC4。(不过不要使用RC4!)。

困难的部分是它们很难安全地实现。另请参见:LadderLeak。

通常,当你的教育达到这个阶段时,你也会选择一种或两种传统的方式来增加你的理解。如果不是,你真的应该这么做。

很多人喜欢在接受教育的早期就直接进入这个阶段。这通常以泪水告终。

如果你已经掌握了我规定的大纲中的每一步,并遵循了两条传统的道路,以至于你在同行评议的期刊上发表了一篇小说攻击文章(并在ePrint上得到了反映),那么你可能已经准备好进入这个阶段了。

额外的好处:如果你是一个毛茸茸的人,并且成为了一名密码学专家,你可以称自己为密码学专家。如果你没有学习密码学的其他原因,那就只是为了双关语!