探索密码学

231 阅读9分钟

作为一个开发人员,或多或少都听说过对称加密、非对称加密、单向散列函数、数字签名、数字证书这几个概念,它们是用来保证在互联网通信过程中数据传输安全的。有人可能会有疑惑,我给传输数据加个密不就安全了,为什么还要搞这么多花样出来?现在我们就来探索一下,这里面到底隐藏了什么不为人知的密码。

一、对称加密

1.概念

对称加密是指用来加密和解密的是同一个秘钥。其特点是加密速度快,但是秘钥容易被黑客截获,所以安全性不高。常见的有AES、DES、3DES算法。

  • DES: 是一种将64bit明文加密成64bit密文的对称密码算法,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit。
  • 3DES: 将DES重复3次所得到的一种密码算法,也叫做3重DES。
  • AES: 取代DES成为新标准的一种对称密码算法,AES的密钥长度有128、192、256bit三种,取代DES成为新标准的一种对称密码算法。

2.密钥配送问题

在使用对称密码时,一定会遇到密钥配送问题。假设,Tom将使用对称密码加密过的消息发给了Jerry,只有将密钥发送给Jerry,Jerry才能完成解密,而且在发送密钥过程中,可能会被Mike窃取密钥,最后Mike也能完成解密。所以用对称加密的话,一旦秘钥被黑客截获,加密就形同虚设。

3.如何解决密钥配送问题

  • 事先共享密钥
  • 密钥分配中心
  • Diffie-Hellman密钥交换
  • 公钥密码(非对称密码)

二、非对称加密

1.概念

非对称加密是指用来加密和解密的是不同的秘钥,它们是成对出现的,称为公钥和私钥,知道其中一个秘钥是无法推导出另外一个秘钥的。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密的特点是安全性高,缺点是加密速度慢。常见的有RSA算法。

2.解决秘钥配送问题

  • 由消息的接收者,生成一对公钥、私钥 
  • 将公钥发给消息的发送者,自己保存私钥
  • 消息的发送者使用公钥加密消息
  • 消息的接受者使用私钥解密消息

3.流程分析

Tom给Jerry发消息,首先由Jerry生成秘钥对Jerry的公钥Jerry的私钥,接着Jerry将Jerry公钥发送给Tom,Tom用Jerry公钥对消息进行加密,然后Tom再把密文发送给Jerry,Jerry再用Jerry私钥进行解密,得到Tom发送的消息。

4.思考

细想一下,非对称加密虽然解决了秘钥配送问题,但是加密速度慢,那有没有更好的解决方式呢?

三、混合加密系统

1.概念

混合密码系统,是将对称密码和公钥密码的优势相结合的方法。不但解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的密钥配送问题。网络上的密码通信所用的SSL/TLS都运用了混合密码系统

2.加密步骤(消息发送者)

会话秘钥:为本次通信随机生成的临时密钥,作为对称密码的密钥,用于加密消息,提高速度。

  1. 首先,消息发送者要拥有消息接收者的公钥;
  2. 生成会话密钥,作为对称密码的密钥,加密消息;
  3. 用消息接收者的公钥,加密会话密钥;
  4. 将第2步第3步生成的加密结果,一并发给消息接收者; 可以看出,是用会话密钥加密的消息(加密方法:对称加密),用公钥加密的会话密钥(加密方法:非对称加密)。

3.解密步骤(消息接收者)

消息接受者接到消息后,会进行以下两步操作:

  1. 消息接收者用自己的私钥解密出会话密钥;
  2. 再用第1步解密出来的会话密钥,解密消息;

4.流程分析

Tom给Jerry发消息,首先由Jerry生成秘钥对Jerry公钥Jerry私钥,接着Jerry将Jerry公钥发送给Tom,Tom先随机生成一个临时的会话秘钥,接着Tom用会话秘钥加密需要发送的消息(对称加密),然后Tom用Jerry公钥会话秘钥进行加密(非对称加密),最后Tom再把包含 加密后的消息加密后的会话秘钥 一起发送给Jerry,Jerry收到之后,先用Jerry私钥进行对 加密后的会话秘钥 解密得到会话秘钥,再用会话秘钥加密后的消息 进行解密。

5.思考

Tom给Jerry发的内容有可能是被篡改的,或者有人伪装成Tom发消息,再或者就是Tom发的,但Tom可以否认。那么问题来了:Jerry怎么确定这段消息的真实性?如何识别篡改、伪装和否认呢?

四、单向散列函数

1.概念

单向散列函数,又称单向Hash函数、消息摘要函数,就是把任意长度的输入消息串,变化成固定长的输出串,且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)。散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,都会计算出固定长度的散列值。单向散列函数的特点就是不同的文件计算出的散列值是不同的,比如一个1G的视频文件,哪怕只是改动其中一个字节,最后计算得到的散列值也是完全不同的,所以单项散列函数通常是用来判断文件是否被篡改过。其还有一个特点就是通过散列值是无法推导出源文件的信息的(单向性)。常用的摘要算法有MD5、SHA等。

  • MD5:是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块,进行暗码运算成一个128位的数值。
  • SHA:SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准,后四者有时并称为SHA-2。

2.应用

判断文件是否被篡改过。假设,我需要判断我电脑里的文件是否被篡改,那我可以先用U盘拷贝一份(保存到一个安全的地方),明天我就可以通过单向散列函数分别对电脑里和U盘里的文件进行加密,如果得到的散列值一致,则没有被篡改,反之则别篡改了。

口令加密。一般我们常用的场景就是登录注册,客户端通过单向散列函数加密密码,上传到服务器,服务器再把加密后的密码存放到数据库,我们得到的只是加密后的密码的散列值。如果密码忘记了,都是找不回的,得重置,如果能找回的那你就要小心了。

五、数字签名

1.概念

数字签名就是一个文件的散列值(摘要)加密后的信息。数字签名是和源文件一起发送给接收方的,接收方收到后对文件单向散列函数算出一个散列值,然后和数字签名中的散列值进行比对,两者不一致的话说明文件被篡改了。

2.流程分析

Tom给Jerry发消息,首先由Tom生成秘钥对Tom公钥Tom私钥,接着Tom将Tom公钥发送给Jerry保存,Tom把消息通过单向散列函数加密得到散列值,再用自己的Tom私钥加密散列值(生成签名),最后Tom再把包含 ‘消息’ 和 ‘签名’ 一起发送给Jerry,Jerry收到之后,先用Tom公钥进行对 '签名' 解密,得到解密后的散列值,再通过单向散列函数对 ‘消息’加密得到新的散列值,对比两个散列值,就知道消息是否被篡改了。

3.思考

从上面我们可以知道,数字签名的作用并不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改,确认消息的完整性和防止消息发送人否认。那么如果有人篡改了文件内容或者签名内容,会是什么结果?假如,如果遭遇了中间人攻击,那么公钥将是伪造的,数字签名也将失效,这又该怎么办?

六、数字证书

1.概念

数字证书是一个经证书授权中心生成的文件,数字证书里一般会包含公钥、公钥拥有者名称、CA的数字签名、有效期、授权中心名称、证书序列号等信息。其中CA的数字签名是验证证书是否被篡改的关键,它其实就是对证书里面除了CA的数字签名以外的内容进行摘要算法得到一个摘要(散列值),然后CA机构用他自己的私钥对这个摘要进行加密就生成了CA的数字签名,CA机构会公开它的公钥,验证证书时就是用这个公钥解密CA的数字签名,然后用来验证证书是否被篡改。

2.流程分析

Tom给Jerry发消息,首先由Jerry生成秘钥对Jerry公钥Jerry私钥,接着Jerry在认证机构(CA)注册自己的公钥,认证机构用自己的私钥对Jerry公钥施加数字签名并生成证书,然后Tom就从CA机构下载得到带有认证机构的数字签名的Jerry公钥(证书),然后Tom再使用认证机构的公钥来验证数字签名,确认Jerry的公钥的合法性,最后Tom用Jerry公钥加密消息并发送给Jerry,Jerry收到消息后,用自己的私钥解密密文得到Tom发送的消息。

3.思考

知道了这些后,那你知道iOS的签名机制又是怎样的呢?