极客时间已完结课程限时免费阅读

03 | 密码学基础:如何让你的密码变得“不可见”?

03 | 密码学基础:如何让你的密码变得“不可见”?-极客时间

03 | 密码学基础:如何让你的密码变得“不可见”?

讲述:何为舟

时长17:52大小16.37M

你好,我是何为舟。
上一讲,我们学习了黄金法则的三部分核心内容:认证、授权、审计。它们描述了用户在使用应用的各个环节,我们需要采取的安全策略。
在掌握了黄金法则之后,你就能以在安全发展规划上的宏观能力,赢得面试官的认可。接下来,他想考验一下你对安全具体知识的理解,以此来判断你能否将安全发展落地。于是,他问了一个非常基础的问题:你懂加解密吗?
可以说,密码学是“黄金法则”的基础技术支撑。失去了密码学的保护,任何认证、授权、审计机制都是“可笑”的鸡肋。
在实际的生活工作中经常会有这样的场景发生:多个用户共用一个 Wi-Fi 来上网、共用一个服务器来跑任务;多个进程共用一个数据库来完成数据存储。在这些场景中,多方交互都通过一个共同的通道来进行,那我们该如何保障其中内容的 CIA 呢?这就需要用到各种加密技术了。今天,我们就一起来学习密码学相关的知识。
首先,我先来普及一个语文知识。密钥中的钥,发音为 yuè,不是 yào。虽然通常情况下,你按正常发音读的话,别人都会听成“蜜月”。但是,我们还是要用正确、专业的发音。
接下来,我来介绍一些经典的密码学算法:对称加密算法、非对称加密算法和散列算法。这些算法的具体实现不是咱们课程的重点,而且本身的过程也非常复杂。在安全这块内容里,你只需要明确了解这些算法的概念及其优缺点,就足够你去选取合适的加密算法了。

对称加密算法

首先,我们来看对称加密算法。所谓对称加密,代表加密和解密使用的是同一个密钥。概念很简单,但是也很不具体、直观。为了帮助你理解,我把具体的加解密过程,画了一张图,你可以看一下。
下面我来具体讲讲这个过程,如果我想给你发一段消息,又不想被其他人知道。那么我作为发送方,会使用加密算法和密钥,生成消息对应的密文;而你作为接收方,想要阅读消息,就需要使用解密算法和一个同样的密钥,来获得明文。
我们常见的经典对称加密算法有 DES、IDEA、AES、国密 SM1 和 SM4。下面我们一起来具体看看。
第一种对称加密算法是 DES(数据加密标准,Data Encryption Standard)。
DES 应该是最早的现代密码学算法之一。它由美国政府提出,密钥长度为 56 位。目前,它暴力破解 56 位密码的时间,已经能控制在 24 小时内了。
DES 实际上是一个过时的密码学算法,目前已经不推荐使用了。关于 DES,还有一点特别有意思。DES 包含一个关键模块:S 盒,其设计的原理一直没有公开。因此,很多人都相信,这个 S 盒中存在后门,只要美国政府需要,就能够解密任何 DES 密文。
第二种对称加密算法是 IDEA(国际数据加密算法,International Data Encryption Algorithm)。
IDEA 由瑞士研究人员设计,密钥长度为 128 位。对比于其他的密码学算法,IDEA 的优势在于没有专利的限制。相比于 DES 和 AES 的使用受到美国政府的控制,IDEA 的设计人员并没有对其设置太多的限制,这让 IDEA 在全世界范围内得到了广泛地使用和研究。
第三种需要了解的对称加密算法是 AES(高级加密标准,Advanced Encryption Standard)。
在 DES 被破解后,美国政府推出了 AES 算法,提供了 128 位、192 位和 256 位三种密钥长度。通常情况下,我们会使用 128 位的密钥,来获得足够的加密强度,同时保证性能不受影响。目前,AES 是国际上最认可的密码学算法。在算力没有突破性进展的前提下,AES 在可预期的未来都是安全的。
最后一种是国密 SM1(SM1 Cryptographic Algorithm)和 SM4(SM4 Cryptographic Algorithm)。
我们知道,密码学作为安全的基础学科,如果全部依靠国外的技术,对于国家安全可能产生不利影响。因此,中国政府提出了一系列加密算法。其中,国密算法 SM1 和 SM4 都属于对称加密的范畴。SM1 算法不公开,属于国家机密,只能通过相关安全产品进行使用。而 SM4 属于国家标准,算法公开,可自行实现使用。国密算法的优点显而易见:受到国家的支持和认可。
借助下面的对比情况表,相信你会对这几种对称加密算法有更清晰的认识。
现在你应该对几种经典的对称加密算法有了初步地了解。接下来,我们来看一看它们是如何应用的。
在加密通信中(如 HTTPS、VPN、SSH 等),通信双方会协商出一个加密算法和密钥,对传输的数据进行加密,从而防止第三方窃取。在类似数据库加密这种存储加密技术中,通信双方也是将存储空间中的数据进行加密,这样即使硬盘被物理窃取,也不会导致信息丢失。在公司内部,为了避免用户的 Cookie 和隐私信息发生泄漏,也需要对它们进行加密存储。
对于大部分公司来说,选取 AES128 进行加解密运算,就能获得较高的安全性和性能。如果是金融或政府行业,在涉及国家层面的对抗上,有一定的合规需求,则需要应用国密算法。
另外,在选取加密算法的时候,存在不同的分组计算模式:ECB/CBC/CFB/OFB/CTR。这些模式的具体细节不是我们学习的重点,在这里就不展开了。你需要知道的是:选取 CBC 和 CTR 这两种推荐使用的模式就可以满足大部分需求了,它们在性能和安全性上都有较好的保证。

非对称加密算法

有对称就一定会有非对称。非对称加密代表加密和解密使用不同的密钥。具体的加解密过程就是,发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。具体我也画了一张图,你可以和上面的对称加密算法的图一起对照着看一下。可以看到,非对称加密和对称加密算法的最大区别就是,加密和解密使用的密钥是不同的。
当使用对称加密算法的时候,你不仅要跟每一个通信方协定一个密钥,还要担心协商过程中密钥泄露的可能性。比如,我当面告诉了你一个密码,怎么保证不被偷听呢?而在非对称加密算法中,公钥是公开信息,不需要保密,我们可以简单地将一个公钥分发给全部的通信方。也就是说,我现在就可以告诉你一个公钥密码,即使这意味着所有阅读这篇文章的人都知道了这个密码,那也没关系。因此,非对称密钥其实主要解决了密钥分发的难题。
除了加密功能外,大部分的非对称算法还提供签名的功能。这也就是说,我们可以使用私钥加密,公钥解密。一旦接收方通过公钥成功解密,我们就能够证明发送方拥有对应的私钥,也就能证实发送方的身份,也就是说,私钥加密就是我们说的签名。
你还可以这样理解,比如我现在和你说话,内容经过了我的私钥加密,你用公钥解得了明文。因为私钥只有我拥有,所以只有我能够发出这段话来,别人都不可能。这也就是说,我不可能狡辩称这段话不是我说的。
所有的非对称加密算法,都是基于各种数学难题来设计的,这些数学难题的特点是:正向计算很容易,反向推倒则无解。经典的非对称加密算法包括:RSA、ECC 和国密 SM2。接下来,我们一个个来看。
我们先看第一种非对称加密算法 RSA(RSA 加密算法,RSA Algorithm)。
RSA 的数学难题是:两个大质数 p、q 相乘的结果 n 很容易计算,但是根据 n 去做质因数分解得到 p、q,则需要很大的计算量。RSA 是比较经典的非对称加密算法,它的主要优势就是性能比较快,但想获得较高的加密强度,需要使用很长的密钥。
我们再来看第二种 ECC(椭圆加密算法,Elliptic Curve Cryptography)。
ECC 是基于椭圆曲线的一个数学难题设计的。目前学术界普遍认为,椭圆曲线的难度高于大质数难题,160 位密钥的 ECC 加密强度,相当于 1088 位密钥的 RSA。因此,ECC 是目前国际上加密强度最高的非对称加密算法。
最后一种是国密 SM2(SM2 Cryptographic Algorithm)。
国密算法 SM2 也是基于椭圆曲线问题设计的,属于国家标准,算法公开,加密强度和国际标准的 ECC 相当。而国密的优势在于国家的支持和认可
好了,这 3 种非对称加密算法的优缺点我也总结成了一张表格,你可以看一看。
我们前面说了,对比于对称加密算法,非对称加密算法最大的优势就是解决密钥分发的问题。因此,现在大部分的认证和签名场景,其实使用的都是非对称加密算法。比如,在 SSH 登录、Git 上传等场景中,我们都可以将自己的公钥上传到服务端,然后由客户端保存私钥。
那么,如果你遇到需要使用非对称加密的场景(比如多对一认证),我推荐你使用 ECC 算法。

散列算法

散列算法应该是最常见到的密码学算法了。大量的应用都在使用 MD5 或者 SHA 算法计算一个唯一的 id。比如 Git 中的提交记录、文件的完整性校验、各种语言中字典或者 Map 的实现等等。很多场景下,我们使用散列算法并不是为了满足什么加密需求,而是利用它可以对任意长度的输入,计算出一个定长的 id。
作为密码学的算法,散列算法除了提供唯一的 id,其更大的利用价值还在于它的不可逆性。当用户注册,提交账号密码时,作为一个安全的应用,是绝对不能够存储明文密码的。因此,我们对用户的密码通过散列算法进行计算,存储最终的散列值。
在后续登录的过程中,我们如果计算出的用户提交的密码的散列值和你存储的散列值一致,就可以通过验证了。这样一来,任何人(即使是内部员工)都不知道用户真实的密码是什么,而用户也能够完成密码的校验。
除了刚才说的不可逆性,在密码学上,我们对散列算法的要求还有:鲁棒性(同样的消息生成同样的摘要)、唯一性(不存在两个不同的消息,能生成同样的摘要)。
经典的散列算法包括 MD5、SHA、国密 SM3。下面我们逐一来看。
我们先来看第 1 种,MD5(消息摘要算法,Message-Digest Algorithm 5)。
MD5 可以用来生成一个 128 位的消息摘要,它是目前应用比较普遍的散列算法,具体的应用场景你可以自行参阅。虽然,因为算法的缺陷,它的唯一性已经被破解了,但是大部分场景下,这并不会构成安全问题。但是,如果不是长度受限(32 个字符),我还是不推荐你继续使用 MD5 的。
第 2 种是 SHA(安全散列算法,Secure Hash Algorithm)。
SHA 是美国开发的政府标准散列算法,分为 SHA-1 和 SHA-2 两个版本,SHA-2 细分的版本我们就不介绍了。和 MD5 相同,虽然 SHA 的唯一性也被破解了,但是这也不会构成大的安全问题。目前,SHA-256 普遍被认为是相对安全的散列算法,也是我最推荐你使用的散列算法。
第 3 种是国密 SM3(SM3 Cryptographic Algorithm)。
国密算法 SM3 是一种散列算法。其属于国家标准,算法公开,加密强度和国际标准的 SHA-256 相当。和国密 SM2 一样,它的优势也在于国家的支持和认可。
上述算法的相关对比情况,我也总结了一下,如下表所示:
另外,我们在使用散列算法的时候,有一点需要注意一下,一定要注意加“盐”。所谓“盐”,就是一串随机的字符,是可以公开的。将用户的密码“盐”进行拼接后,再进行散列计算,这样,即使两个用户设置了相同的密码,也会拥有不同的散列值。同时,黑客往往会提前计算一个彩虹表来提升暴力破解散列值的效率,而我们能够通过加“盐”进行对抗。“盐”值越长,安全性就越高。

总结

好了,我们来总结一下这一节,你需要掌握的重点内容。
在这节课中,我对各种加密算法和应用场景进行了全面的介绍。密码学是一门深奥的学科,而作为密码学的使用者,你只需要正确地理解各类算法的特性和功能,就可以满足日常的应用需求了。
总的来说,在使用的时候,你要记住下面这些内容:对称加密具备较高的安全性和性能,要优先考虑。在一对多的场景中(如多人登录服务器),存在密钥分发难题的时候,我们要使用非对称加密;不需要可逆计算的时候(如存储密码),我们就使用散列算法。
在具体算法的选取上,你只需要记住:对称加密用 AES-CTR、非对称加密用 ECC、散列算法用 SHA256 加盐。这些算法就能够满足大部分的使用场景了,并且在未来很长一段时间内,都可以保持一个较高的安全强度。

思考题

通过今天的学习,相信你已经了解了密码学的各种概念和知识。对于这些加密算法,哪些你比较了解或者使用过呢?可以谈谈你的想法。
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 16

提建议

上一篇
02 | 安全原则:我们应该如何上手解决安全问题?
下一篇
04 | 身份认证:除了账号密码,我们还能怎么做身份认证?
unpreview
 写留言

精选留言(55)

  • 普通熊猫 ଘ(੭ˊ꒳...
    2020-01-03
    AES,你值得拥有,A代表AES-CTR,E代表ECC,S代表SHA256 加盐。 匿了

    作者回复: 这个总结可以,我都没想到。

    32
  • rocedu
    2019-12-10
    密钥的发音问题,依据在哪?

    作者回复: 你好,感谢你的留言。如果一定要追究依据的话,可以查阅字典,只有钥匙读yao。这其实是北京人的方言发音,钥其实是只有yue这个读法的。 不过嘛,字典也会适应潮流,将错就错,比如‘空穴来风’的意思。所以,科普yue仅仅是我的偏执,不需要认同。

    共 5 条评论
    19
  • Geek_f7f72f
    2019-12-10
    sha3,blake2不介绍下吗,相比所谓的国密,应用范围更广吧

    作者回复: 现有技术没有出现明显的问题,所以大家还是习惯性使用传统的算法,这些新算法的替代性和普及性不会那么高。 另外,不要低估国密,最近和一些数据安全的人聊,他们表示如果只做国内业务的话,最好都用国密。因为说不定哪天等保或者国内的数据安全法,就强制要求国密了。

    共 2 条评论
    19
  • Vokey
    2019-12-19
    《现代汉语词典(第7版)》: 【密钥】mìyuè (口语中多读mìyào)

    作者回复: 哈哈,官方实锤~

    共 2 条评论
    13
  • return
    2019-12-09
    老师 请教一下: 唯一性(不存在两个不同的消息,能生成同样的摘要)。 我理解 散列算法做不到这一点吧, 消息是任意的 是个无限集,但是散列值 是固定长度,必然是有限的。 无限映射有限 肯定会有不同消息生成相同摘要吧。
    展开

    作者回复: 理论是这样没错,但实际使用时,你肯定不会有那么多数据需要去做散列。所以,追求的是在有限数据量下,碰撞概率几乎为0。

    共 2 条评论
    13
  • splm
    2020-01-08
    先对账号密码md5,然后加盐;那二次进入的时候,账号密码没变,但盐值变了,又是怎么匹配的呢?

    作者回复: 盐值是和账号作唯一关联,且不变的。

    共 3 条评论
    10
  • Geek_David
    2020-03-31
    公司钥的易混点 加密:公钥加密私钥解密 签名:私钥加密公钥解密 国密算法记忆: SM1:对称加密 算法不公开 SM4: 对称加密 算法公开 SM2:非对称加密 SM4: 散列算法不可逆 常用算法: AES128+CTR ECC SHA256+salt
    展开
    共 2 条评论
    7
  • 张望
    2019-12-14
    建议程序员们也多关注国家法律法规要求,我国密码法马上正式实施了,其实对于加密算法选用就有了明确的法律要求,没有影响力的小软件还好说,做大了的软件一定会被监管到的,到时再更换全套加密算法成本也会很高的。

    作者回复: 嗯,最近跟同行聊的时候。他们也表示公司内部开始推进国密算法的应用了,为了避免以后又要改。不过吧,这个改动还是有难度的,毕竟国际算法都用了这么多年了,老旧代码改动成本不容小觑。

    6
  • Geek_f7f72f
    2019-12-10
    TLS很早就弃用了IDEA,标记为不安全,是因为理论上的缺陷,还是其他原因?

    作者回复: 你好,感谢你的留言。这个问题之前还真没注意到,特地查了一下。看到的原因也就是“due to the availability of faster algorithms”。也就是说,已经有更快更好的AES了,就没有再使用IDEA的意义了。

    6
  • 小老鼠
    2019-12-31
    HTTPS是对称还是非对称?盐值放在哪儿比较安全?

    作者回复: 协商密钥是非对称的,密钥协商完之后就是对称加密了。 盐值一般和用户名等唯一标识放一块。盐值不用考虑保密性,只要完全随机且唯一对应即可。

    共 4 条评论
    4
  • stg609
    2020-05-29
    基于https的前提下,前端加密真的有必要吗? https已经防止了中间人攻击,前端如果真被破解或被植入恶意代码,黑客完全可以拿到加密前的明文。我觉得前端做加密解决不了问题,反而此地无银三百两。

    作者回复: 可以把这个问题拆开看,数据泄露可能有三个点:前端,后端,传输过程。https可以解决传输过程中的泄露问题。但前后端本身,同样存在泄露风险。比如,你去做一个代理登录,用户提交密码给你,你再拿密码去第三方认证,这个密码就泄露给你了。如果前端加密了,那么你只拿到密文,虽然能完成认证,但其实不知道密码。

    共 2 条评论
    3
  • 鸵鸟
    2019-12-19
    非对称加密推荐ECC的原因是什么呢?当前在手机PC的系统安全这些业务上,苹果高通都是使用的RSA,而国内一线手机厂商开始在布局国密SM2同时支持RSA,请问ECC的优势在哪里呢?

    作者回复: 加密强度高。SM2和ECC的原理是一致的,都是椭圆曲线算法。ECC的缺陷在于,生成一组密钥的时间耗时比较长,因此性能上会有一定影响。

    共 2 条评论
    3
  • 有学识的兔子
    2019-12-14
    国密算法的价值在哪里呢? 从描述来看还是参考ecc aes等算法,但性能还不确定。既然已经有公开的高可用算法,为什么不用或者参与该算法的研究中,进一步提升这类知名加密算法呢

    作者回复: 这就是国家层面的考量了。一方面,是对加密算法的安全性考量,比如DES中可能的后门。另一方面,也是对专利版权的保护,毕竟自己的专利,自己才有可控性。这就和芯片一样,现在用外国的没啥问题,哪天它不让你用了呢?

    共 3 条评论
    3
  • 麋鹿在泛舟
    2019-12-12
    请问如何保证对称秘钥在非可信环境中的安全传输,是不是只能只能使用非对称算法先加密才可以,有其他方案么

    作者回复: 你好,感谢你的留言。在https中使用了DH密钥交换算法实现的。可以想象成一边出一半的密钥,然后就能够拼成一个完整密钥。因篇幅限制,课程中没有具体讲。

    3
  • jun
    2020-04-20
    何老师您好!我小白一个,有些问题不了解。 比如:非对称加密,公钥是公开的,那么黑客如果获取到公钥也就可以解密通过私钥加密的内容,这样一样会消息泄露吧。 另外:公钥加密私钥解密,以及私钥加密公钥解密其中原理,不知后面内容是否有讲

    作者回复: 是的,非对称加密是单向的。通过私钥加密公钥解密,只能用来做签名,证明发送者拥有私钥。具体原理比较细节,可以自行百度一下。

    2
  • Geek_f7f72f
    2019-12-16
    评论里有提到Bcrypt, 它目前的安全性如何,有没有更好的替代?

    作者回复: 我理解的Bcrypt其实就是散列+盐的封装实现,作为一种最佳实践的封装,安全性上应该不会出现太大问题。

    2
  • mz
    2019-12-09
    请问老师,类似 PHP 这种通常数据库的信息都是写在配置文件中,这个有没有啥安全的方式呢?

    作者回复: 数据库信息落配置文件其实没有太多问题,因为就算你存在其他加密的配置中心里面,你连配置中心的加密密钥或者认证信息还是会落到配置文件中。所以,更主要的还是保护代码和配置文件的机密性。

    共 2 条评论
    2
  • 吴小智
    2020-04-30
    老师能介绍一下 KMS 吗?看介绍说,可以用 KMS 来存储密钥,但是一直不太理解是如何做到安全的。

    作者回复: KMS可以见简单理解为一个云端的加解密服务,用户端和服务端的加解密操作都送到KMS执行,密钥不外放。但是KMS的安全性还是得依赖前置的认证,它只是保障可信用户不会产生错误使用加解密或者泄露密钥等行为。

    1
  • 小幺鸡
    2020-04-11
    没太理解非对称加密RSA秘钥生成速度慢?

    作者回复: 主要和对称加密相比,对称加密的密钥随机生成即可,性能自然很快。而非对称加密的密钥,需要先计算某个数学问题。比如rsa的密钥,首先要找出两个大质数,运算时间自然会上升不少。

    1
  • Geek_f4f0d4
    2020-02-29
    老师,你好,如果使用https协议,用户在密码输入时,是否还需要在前端(通过JS)进行散列加密?

    作者回复: https可以保证传输过程中不被窃听。但最好还是对密码作散列,因为你同样需要保证服务端的密码不被泄露。最简单的,明文传输的话,你如何保证开发人员不会监守自盗?

    1