控制台
博客/开发者/ 还分不清摘要、加密?一文带你辨析密码学中的各种基本概念
还分不清摘要、加密?一文带你辨析密码学中的各种基本概念
Authing 官方2021-08-26阅读 816
你一定听到过这些词:加密、解密,也听过种种说法:
 

我要用 md5 把密码加密一下

将 base64 字符串进行解密

把 token 进行加密,验证时需要解密

 
很遗憾,以上的说法都是错误的。那么本文就带领大家一探密码学的究竟。当你说「加密」的时候你究竟想说的是?当你说「解密」的时候,你实际指的是?

编码

首先我们从编码开始。一生二,二生三,三生万物,编码就是「一」。试想一下如何用一个只能存储数字的设备来存储汉字呢?一个很自然的想法是将汉字转化成数字,然后再存起来:
 
例如:用 1 来表示「一」,用 2 来表示「二」,用 24 来表示「人」...... 将所有汉字映射成一个数字,然后将这些数字存储起来。
 
需要对编码方式进行事先约定,不然你一个编码,我一个编码,大家谁都听不懂谁说的是什么。
谁让电脑是美国人最先发明的,非常流行普及的编码方案也是人家提出的,让我们看看 ASCII 编码:
 
 
所以当你想要将「Good morning」存进电脑里,需要存「47 6f 6f 64 20 6d 6f 72 6e 69 6e 67」(16 进制,篇幅原因不再展开成为二进制)。
 
那么 base64 是什么?base64 也是一套编码规范,可以将二进制数据映射成可见字符(什么是不可见字符?像空格,换行符,制表符都是不可见的)。应用场景呢,比如你想把一张图片塞到 JSON 格式的数据里面,就要对图片二进制流进行 base64 编码。
 
所以,以后,作为一个密码学专家,你就要说,我会用 base64 算法编码一下图片文件。
 
最后一个问题,对信息编码会产生信息损失吗?请读者自己思考一下。

摘要

试想有一个搅拌机,放进去原料,输出果汁。在计算机的世界里,也有这样一个摘要机,输入数据,会输出数据的摘要。常见的摘要算法有 sha1、md5。
 
 
可以从摘要值反推输入的信息吗?可以从果汁还原水果吗?熟鸡蛋可以反生吗?摘要的计算是单向的,只能通过输入的信息计算摘要而不能从摘要反推信息。
 
MD5 算法总会输出一个 128 位二进制数,那么我计算一个电影文件的摘要,我可以通过这个 128 二进制数来还原整个电影吗?显然不能。
 
摘要算法的另一个特性是对于任意的输入变动,得出的结果是截然不同的。见上图,123456 和 1234567 只差了一个数字,计算出来的摘要值是完全不同的。即使你偷偷剪掉一个电影的一秒钟,计算出的电影摘要值也是完全不同的。
 
所以这有什么用呢?假设你是电影导演,在电影上映前需要先将剪辑后的作品发给不同的公司进行审核校对,那么你可以偷偷剪掉第一秒,计算一个摘要值,然后发给一个公司;偷偷剪掉第二秒,计算一个摘要值,然后发给第二个公司,以此类推。这样一旦有人将你的作品泄露到网上,你就能够通过摘要值立刻知道是哪家公司泄露出去的!还记得《权力的游戏》最后一季上映前先泄露了四集吗?如果他们使用这种方法,追查起来就可以很方便了。
 
总结一下摘要的特性:不可逆,失之毫厘,谬以千里。
 
所以,以后,作为一个密码学专家,你就要说,我要用 MD5 对明文密码做一个摘要然后再存储到数据库。

加密

试想在现实世界里,如果加密传递信息呢?把信息写在纸上,然后把纸装进盒子里,再把盒子锁上,最后把盒子邮寄给接受者。前提是接收者必须有这把锁的钥匙。你需要另寻办法将钥匙给到他。
 
在计算机的世界里,对称加密算法的原理也是类似。你有一段信息,有一个密钥,你用一段文字作为密钥,对你的信息做数学运算,得到一个结果,然后你把结果发给你的接收方,他用同样的文字作为密钥,对加密结果做数学运算,得到信息的原文。
 
常见的对称加密方法 AES、DES,本质上都是使用一段文字对原始信息做数学运算,然后将结果发送给接收方。
 
加密的意义在于,及时信息在传递过程中被黑客截获,他也不知道双方在说什么。
 
 
 
那么对称加密的密钥如何传递呢?另寻办法的方法是什么?非对称加密呼之欲出。非对称加密算法,用于加密和解密的密钥是不同的。也就是说,一段文字用于加密信息,另一段文字用于解密加密的结果。

公钥

在数学上,公钥就是两个数字(e,n)。e 一般取 65537,n = p * q(p 、q 为质数)。公钥用于加密。

私钥

在数学上,私钥就是两个数字(d,n)。d 是 e 对于 ø(n)(欧拉函数)的逆元。私钥用于解密。

公钥与私钥的关系

1. 在数学上没有区别,都是一对数字,取决于将哪一组数字公开。
2. 公钥加密的内容要使用私钥解密;私钥加密的内容要使用公钥解密。
3. 私钥要自己保护好,不得泄露;公钥可以公开在互联网上,任何人都可以用它来加密信息,当然加密内容只有私钥能够解出来。
 
下面是一次 RSA 加密信息的过程:
 
 
 
Q: 可不可以用私钥加密数据呢?
 
A: 可以!
 
Q: 那用公钥解密数据?
 
A: 是的!
 
Q: 公钥暴露在网络上,任何人都能解密数据,那加密还有什么意义?
 
A: 继续往下看!
拓展:上图中要计算每个字符编码的 e 次幂,需要算几次?

签名

先计算信息的摘要值,用私钥对摘要值进行加密,生成的结果叫签名值,签名算法有 RS256。顾名思义,是 RSA + HS256 的组合写法。签名需要分两步走:
 
  1. 计算信息的摘要值
  2. 用私钥加密摘要值,得到签名值
 

验签

利用公钥对签名信息进行验证。拿到一段信息和它的签名值,需要先本地计算信息摘要值,用公钥解密签名值,和计算的信息摘要值进行比对。
 
 
还记得公钥和私钥的区别吗?如果我们用私钥对数据加密,任何人都可以用公钥解密加密结果(公钥是公开的),如果解出来的内容是有意义的,那么数据的来源一定是私钥的持有者,如果解出来的内容是乱码,那么数据的来源就不是私钥的持有者。
 
那么之前对称加密算法的密钥传递问题也解决了,接收方将公钥给发送方,发送方用公钥加密一个密钥,接收方用私钥解密加密后的内容,得到密钥原文。如此一来,钥匙就安全地交给接收方了。
 
总结一下,如果你想对一段信息签名,先算它的摘要,然后用私钥加密摘要值,这样所有人都可以使用公钥验证它的正确性;如果你想加密传输一段信息,用公钥加密这段信息,这样信息接受者可以用私钥解密加密后的结果。
 
当你说加密的时候,你实际想说:编码、摘要、加密;当你说解密的时候,你实际想说:编码、解密、验签。

文章作者

avatar

Authing 官方

0

文章总数

authing blog rqcode
关注 Authing 公众号
随时随地发现更多内容
authing blog rqcode
添加 Authing 小助手
加入 Authing 开发者大家庭