本文不研究加密算法的原理和实现,仅仅从加密算法应用的角度,来分析目前加密算法有哪些分类,各个分类有哪些代表性的算法,并按自己的目前的理解阐述他们的优缺点,以及各自适用的场合。
首先根据我自己的项目经历来个总结,目前在项目中应用较多的加密算法可以分为以下几个类别:1.散列函数(也称哈希函数)算法2.对称加密算法3.非对称加密算法4.组合加密技术

1.散列函数

与其说散列函数是一种加密算法,不如说它是一种数据特征值提取算法 —— 以其中被广泛使用的一员,MD5算法为例,其具有以下特点:

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  • 容易计算:从原数据计算出MD5值很容易。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    散列算法的过程是不可逆的,可以通过数据得到其特征值,但是没办法根据特征值还原数据。
    其运算过程可以概括为:

    常用的散列函数包括:MD5、SHA1、SHA2(包括SHA128、SHA256等)
    散列函数的应用很广,下面介绍其一些比较典型应用场景。

    1.1文件一致性校验

    假如有一份1个G的文件需要发送给用户,但是数据传输通道是不安全的,那么可以计算出文件的散列值(为保证散列值不被窃取,可用其他加密方式将散列值加密并发送给用户),用户收到文件后自行计算其散列值,计算结果和收到的散列值相同则认为文件没有被篡改,否则说明文件遭到了篡改,流程如下:

1.2 文件秒传

例如百度云的秒传功能。有没有某一次,辛辛苦苦下了好久的几个G珍贵小电影资源,想传到网盘里边珍藏起来,结果几个G的东西不到一分钟就上传完了? 其原理并不是百度的服务写入速度和你家的网速有多快,而是有这么一个流程:

这样,用户A上传xxx.avi花了1个小时,前人栽树后人乘凉,你就只需要花1分钟了~

1.3 保存用户密码

为了防止被脱裤,最好不要在DB里边保存用户的明文密码,可以保存用户密码的散列值,每次用户登录的时候,用散列函数对用户输入的密码进行计算,得到结果后和db里边的散列值进行比对,一致则登录成功。
黑客脱裤成功拿到用户密码散列值后,可能拿“彩虹表”对用户密码的散列值进行暴力匹配,一些较简单的密码如“123456”、生日组合等,它们的散列值是固定的,会因此而被黑客匹配上。为了应对这种情况可以对用户密码“加盐”,将“盐”和散列值一起保存。“123456”对应的散列值在彩虹表中有存储,但是“123456salt-asdgasdgsagasazsdasdf233zxcsdf”,在彩虹表中就没有了,这样黑客就没办法从彩虹表中获取常见密码的原文了!

上图:存储原文密码的情况

上图:存储密码散列值,复杂密码安全,简单密码泄露

上图:加盐散列,密码安全

1.4 优缺点

上面的介绍中列举的特点就是散列函数的优点,用来做文件一致性校验特别方便。
而其缺点是光使用这个函数的话散列值的传输仍然得不到安全性保证,传输过程中散列值被替换,就前功尽弃了!

2 对称加密算法

这一类加密算法的特点是,加密时可以根据一份秘钥对原文进行加密,得到密文;解密者也可以根据相同的秘钥对密文进行解密, 得到原文。
与上面的散列函数加密不同,对称加密可以认为是一种真正的加密算法——可以用来实现数据的加密通信,其工作流程如下:

常用的对称加密算法包括DES算法、AES算法等。 由于对称加密需要一个秘钥,而秘钥在加密者与解密者之间传输又很难保证安全性,所以目前用对称加密算法的话主要是用在加密者解密者相同,或者加密者解密者相对固定的场景。

2.1 加密cookie中的信息

web应用中可能在cookie中存放登录用户的一些信息,但是这些信息在传输的过程中是可以被第三方看到的,假如不希望某些信息泄露,则可以使用对称加密算法加密这些数据后再写入cookie中,使用时再解密。

这个过程中不会有秘钥传输的问题,不用担心私钥泄露。

2.2 优缺点

对称加密算法的优点很明显:加解密速度快,秘钥很长时加密数据很难破解。
缺点同样也很明显:秘钥传输不安全,某些多方加解密通信的场合不适用。
若采用中心式的加解密:

如果我们中出了一个内奸! 那么整个网络的通信都会被敌人窃取。

如果用户之间要两两通信:

这里还只有6个人,而上图中每一条线都代表要生成、分配一份秘钥。
网管:”老子不干了!“

3.非对称加密算法

非对称加密算法的特点是,秘钥一次会生成一对,其中一份秘钥由自己保存,不能公开出去,称为“私钥”,另外一份是可以公开出去的,称为“公钥”。
将原文用公钥进行加密,得到的密文只有用对应私钥才可以解密得到原文;将原文用私钥加密得到的密文,也只有用对应的公钥才能解密得到原文。
这样就解决了对称加密的秘钥传输过程无法保证安全的问题,加密者想与多方通信,也只需要公开一份自己的公钥就行了,无需对每个通信者生成多份秘钥。
非对称加密的流程:

目前应用最广泛的非对称加密是RSA加密。

3.1非对称加密的应用

非对称加密应用十分广泛,但是很少单独使用,大多是和其他加密算法配合在一起使用,包括TLS/SSL、CA证书与https通信等。这里就不一一列举了。后边再具体介绍这些应用。

3.2 优缺点

非对称加密最大的优点是可以保证秘钥的传输安全,且加密安全性极高。
缺点是对大数据加密速度较慢,所以一般和散列函数配合使用,用非对称加密来加密散列函数计算得到的散列值,那样速度就快多了。

4.组合加密技术

从上面的介绍中可以看到,各种加密算法都有自己的优缺点,很多场景并不能使用一种加密算法就能满足所有需求。现实应用中有很多“混搭”风格的加密技术正在被使用,下面列举一些我所了解到的算法或技术组合。

4.1 hmac加密算法

hmac加密算法是一种需要秘钥的散列算法,作为一个使用者我们暂时不去关心它的运算步骤,在使用理解方面,我认为可以将hmac加密就理解为加盐的散列算法,此处的“盐”就相当于hmac算法的秘钥,当然它们内部的计算逻辑是不同的。

hmac加密算法主要用于校验客户端的身份,下面引用百度百科中的一个例子:
HMAC的一个典型应用是用在“质疑/应答”(Challenge/Response)身份认证中。
认证流程

  1. 先由客户端向服务器发出一个验证请求。
  2. 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为质疑)。
  3. 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
  4. 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户
    安全性浅析
    由上面的介绍,我们可以看出,HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:
    (1) 使用的密钥是双方事先约定的,第三方不可能知道。由3.2介绍的应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。
    工作流程如下:

4.1 RSA签名、校验

RSA签名算法是RSA加密配合散列函数的一种数据加密技术。如百度的证书

CA机构采用的就是sha256RSA算法对颁发给百度的证书进行签名(关于CA证书的知识会在后边介绍)。
其实sha256RSA签名校验算法并不是单独发明的一种新的算法,而是RSA加密和sha256散列函数的一个组合使用,其原理如下:

sha256RSA签名流程

sha256RSA校验流程

5.总结

知己知彼,方能百战百胜。 业界加密算法数量繁多,如果不仔细理解各类加密算法异同,很容易迷失在算法海洋中。

作为使用者我们可以不关心各类加密算法内部的数学原理,毕竟我们没必要每个人都亲自去做去做算法研发,但是对大概的算法分类还是要有个概念。本文的重点在于根据我自己的理解对加密算法进行了一个归类,归类中各列举的一两个常见加密算法只是为了加深理解,归类的好处在于,以后需要熟悉新的算法,可以很直观的将它归入某一类算法,或者某几类算法的组合,这样理解起来就容易多了。

还有一些加密算法,它们涉及到安全的秘钥交换,但是无关具体加密应用,所以本文没有去介绍它们,例如DiffieHellman算法等,有兴趣的同学可以自行去了解一下。

加密算法在互联网中的应用无处不在,TLS/SSL、CA证书与https传输、SSH等等,本文的目的在于对加密算法分类理解,故而没有花功夫去详细介绍这些技术的原理细节,以后有空的话深入理解一下再来补充这方面的东西吧~

☞ 参与评论