让我直接进入正题,先讲一下背后的故事。
在开源社区里,人们认识我是 vkweb —— vkweb。
我做了一个免费和开源的课程,旨在帮助开发者学习密码学概念。课程专为开发者的需求设计,只包含我们作为开发者必须知道的内容。基本上,无论是白天还是晚上使用终端的任何人都会从这个课程中受益。
🟢 它现在是直播:Curious Cryptography。可以在这里查看。
……
现在我们来谈谈背后的故事。最后我们会介绍课程内容。我刚开始学习编程时,是在作为一名初学者开发者时,参加了哈佛大学的在线课程CS50x。在阅读网络上的文档时,我发现了很多加密术语。
像 salt
、哈希密码
、PBKDF2
、密钥对(key pair)
这样的术语。像大多数开发者一样,我也没太在意这些。只是在 Google 上随便看了两眼,就直接去处理下一个要紧的 bug 或着手实现下一个功能了。
过了一段时间。我在学习CS50x课程。我看到了一条推文或可能是博客文章,我已经不记得准确是哪个了,但肯定是来自Quincy Larson,freeCodeCamp.org的创始人。他在开源社区里宣布了,他们决定重新设计他们的全栈课程。
昆西鼓励开源社区帮助构建新的课程。我想看看自己能不能帮忙。我翻看了他们CurriculumExpansion GitHub仓库的议题,发现了一个感兴趣的议题。
这个问题是关于向freeCodeCamp学员教授密码学概念的。我决定接手这个任务。因此,我首先深入研究了RSA公钥算法的内部运作。那时候,Khan Academy的视频和文章(https://www.khanacademy.org/computing/computer-science/cryptography)对我不无帮助。
这是为 freeCodeCamp 的密码学课程设计的 RSA 数字签名系统。
在Kristofer Koishigawa的建议下,我提交了一个包含课程内容的拉取请求(创建了一个包含课程内容的拉取请求**)。在这个课程中,freeCodeCamp 学习者将通过编写自己的公钥RSA算法来构建一个数字签名系统。在构建过程中,他们会学到加密、哈希、公钥、私钥
等相关知识。
一个小说明:永远不要自己编写加密算法用于生产环境。 那个 RSA 实现只是为了教学。现在我们继续。
我们今天在这里。现在,经过了这4到5年,那门课程一直没上线。我不知道原因。回头一看,才意识到,那门课其实不是教课的好方法。
最近,我有了一些空闲时间来做自己的项目。我打算为程序员开发一门全新的密码学课程。
这次我想做得更好。我们制作的freeCodeCamp课程对开发者来说不太有用。
我们开发者不需要也不应该去管算法里面的数学问题。这都是密码学专家的活儿,完全是另一套东西。作为开发者,我们只需要对这些概念有个基本的了解,知道我们在做什么以及为什么要这么做。
为了不让我们这些开发者像下面这幅xkcd漫画中的cueball那样做。
我开始制作这个新课程。我收集了对开发者来说重要的概念。我希望只涵盖开发者在日常工作中的概念。
因此,我还决定使这门课程既有趣又有深度且互动。因此,我创建了自己的课程网站,包含编程挑战和有趣的图表。
让我给你讲讲这门课程中将涵盖的概念。这样你可以看看是否值得花时间在这个课程上,或者直接跳过。这门课程大约需要1.5小时来完成,分为六个部分。
1. 对称密钥加密,
我们的课程从古代皇帝需要与军队指挥官通信而不让敌人理解消息的需求讲起,引出密码学的起源。我们讨论了密码学中最基本的原则之一——Kerckhoff's 原则。我们让你明白为什么密钥具有非常高的变化性这一点对加密的安全性至关重要。
2. 代码题:凯撒密码(简单加密方式)
这是一次编码挑战,你需要完成decrypt
函数,以将ciphertext
解密为预期的plaintext
。你将会了解最著名的加密技术之一——凯撒密码!
3. 哈希函数
我们不仅讨论了哈希表中使用的哈希函数,还介绍了加密哈希函数的重要性,尤其是它们为何绝对不能有哈希碰撞。我们将会看到两个可能带来危险的哈希碰撞的例子,比如在Ubuntu包的完整性检查以及Git提交中。
4. 密码 hashing.
这只会越来越有意思。我们给你一个问题。想象你有一个数千用户的关键数据库,你会如何存储密码,以确保万一数据库被攻击,用户的密码也不会泄露出去。另外,为什么直接加密密码并不是最佳选择。
5. 彩虹表和加盐
我们发现仅仅对密码进行哈希处理是远远不够的。攻击者开始使用一种特殊的数据结构称为彩虹表(Rainbow table),它能在短短几秒钟内破解密码。然后我们了解到通过给每个密码添加独特的随机信息(即加盐)是如何帮助保护我们免受这种攻击的。
6. PBKDF-2: 减慢过程
我们面临的最后一种攻击手段是基于GPU的攻击。GPU拥有数千个核心,可以同时运行数十亿个任务,对于密码破解者来说,它们相当于超级武器。这对密码破解者来说是超级力量。
我们将了解 PBKDF-2(基于密码的密钥派生函数)。并看看它是如何帮助防御基于GPU的攻击的。我们还将看看Django是如何使用PBKDF-2来保护密码的。
恭喜你啦,伙计🎉。这意味着课程的第一部分已经结束了!
课程的后半部分主要涉及Diffie-Hellman密钥交换技术、RSA公钥加密算法和TLS协议。
在制作第二部分之前,我决定先发布第一部分,以便能获得开发者的反馈,看看第一部分是否真正有价值。
如果很多开发者能从这当中真正获益,那么我会全力以赴做接下来的部分。它永远都会免费,这绝对有保证。
我会在我的Twitter上发更新。关注我,我很少发推文,但每次都会尽量让内容有用。
请在下面评论区留言或通过我的 Twitter 私信告诉我,如果你觉得这门课挺有用,这会是我继续改进这门课的动力!
我会等着您给的评论和反馈哦!
感谢你读到这里,你真是个勇士!<3 加油!
-- vkweb,一个开源项目。