#> RESTKHZ _

休止千鹤 | 我依旧是一名平凡的学生

简单密码:写给程序员的密码学入门(一:引言)

  休止千鹤  |    11/05/2024

很久没有更新博客了,今天打算开一个大新坑。
我注意到很多程序员,开发者,甚至是一些信息安全从业者,密码学这块…缺了一些认识。

所以网络上面也流传了很多误解。比如

  • TLS,很多人认为是用RSA加密的。
  • base64, md5加密。
  • TLS无用。
  • 自己开发自己的密码,黑客破不了。

如果以上说法,你没看出有什么问题,那么这篇文章就是给你写的。

唉,难道简中网络上就没有好的密码学资料吗?有是有的。但是似乎都有一定的阅读门槛,对自学的人并不友好。

所以我打算开一个坑,尽量用简单的话说明白:
“我们在某个场景中遇到了什么问题,所以我们需要什么”的这种思路。尽可能往原理上讲。
恩…当然我尽量不搬出公式,不会有证明,s盒之类的出现。

这篇文章这是第五个版本了,万事开头难。再来一遍吧。

一: 密码学解决了什么

恩,密码学在解决什么?加密?破解密码?实际上远远不止这些。

比如你有没有想过,

  • 我能不能用一个同名的WIFI钓鱼,骗到别人连接WIFI时的密码?
  • 我怎么确定这个消息就是这个人发的?会不会有人假扮?
  • 比如,TLS在握手之前,双方还没加密的时候,是怎么把密码安全地“发给”对方的?

其实密码学都有对应“工具”可以解决。接下来我会介绍这些工具。

想一个具体的场景。A想发信息给B。通信只能经过邮差E,没有别的渠道。
但是邮差E你信不过啊。怎么办呢?
A把消息对称加密,但是B没有密码。直接发密码那不可能的。
A用非对称加密,然后消息签名。可以吗?不可以。B还不知道你的公钥。
使用DH进行密钥交换可以吗?不可以。因为E可能会截取你们的通信,和你们两个人都进行DH密钥交换。
这里就不得不引入PKI,一个可信任的第三方。他可以是CA,也可以是公钥保存服务器。

这个例子我会放在未来的TLS再说一遍。

在下一个章节我们会讲最重要的工具之一,哈希(Hash)

下面是两个枯燥的原则,之前版本里写的舍不得删,就先放到这里了。
不想看就跳过吧。

二:不要用自己发明的密码算法

不要手贱,OK? 如果你是一个开发者,可能处境比较尴尬:你的产品对于客户端是透明的。任何人都可以试图逆向你的产品从而看到加密算法。即便你可以通过混淆,加壳之类的手段反制。

但是我见过的自己开发的密码都不怎么高明。

你能看到的很多程序员自己做的加密大多数就是:字符转Ascii,加减乘除,取余,base64,xor,这五种处理的排列组合。呃,还用在Android APP和Javascript里。这些都是利用编码和凯撒位移,仿射密码的算法,这些方法可能对于一个信息安全新手来说都是可以轻松解决的,甚至整个过程可能都不需要看源码。

现代密码算法已经是一门学科,有无数学者在发明并且试图破解。
所以,请你相信现代的密码学加密算法。用成熟的工具,用别人已经在代码里实现的工具。

三:柯克霍夫原则

你可能听过Enigma密码机。二战期间这是德国的军用密码机。这套机器一被俘获后,经过分析,盟军掌握了破解德军通信的能力。德军就算换密码也没用。而再开发一个新的密码机并量产下发这套密码系统成本巨大。

简单地说,柯克霍夫原则就是:
一个密码系统的安全性不应该依赖于算法的保密性,而应依赖于密钥的保密性。

现在,你密码泄漏以后你会更换密码,而不是发明新的密码算法一样。通过保密密码系统是不可靠的。
这套原则也引出一个方法论,开放式安全:
公开密码算法,全世界都可以用,全世界也都在审计,找问题。这样尽可能迫使不安全的算法被淘汰,不断对抗,算法向着更安全的方向进步。而我们只需要保护好密钥就OK。

目前我们的那些常见算法比如AES之类的,可以说几乎是牢不可破了,你应该信任这些算法。
(不排除NSA有什么黑科技,参见曾经DES和差分分析)


Views:

 Comments


(no comments...maybe you can be the first?)