任何系统的开发中,无论系统的规模有多大或者是多小,对于一些敏感数据,都是需要加密保护的,防止意外泄露造成不必要的损失及用户对于系统的不信赖。当然HTTP各个环节的攻击造成的敏感数据泄露我们不讨论,我们只讨论一些常见的加解密方法及使用即可。
1、MD5加解密
这个严格意义上来说,MD5不是加解密范畴的东西,全名应该叫做消息摘要算法,由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。顾名思义,它的意思是对某一个数据包进行摘要产生散列值。打个比喻:你要从西安将一个文件发送到北京,会通过不同的网络环境,而这个网络环境有物理的、有非物理的,你进行传输,你怎么保证你的数据不在传输过程中被恶意修改?你怎么保证你的数据没有丢包是完整的?你怎么保证你接收到的数据是原始的从西安传过来的数据?这个时候就有必要生成一个特征码,并且要求对于不同的数据生成的特征码必定肯定是不同的,对于相同的数据生成的特征码是完全一致的!哪怕是数据中间一个标点符号的修改,都是严格区别非一致性的。你接收到数据后,用相同的生成算法,对于这个数据生成散列值,然后与A的散列值比较,如果一样,说明你接收到的数据就是A传过来的数据,中途没有人修改,也没有丢包。如果你生成的和A的不一样,那抱歉 ,你收到的数据是没用的,已经出现问题了,可以丢弃不能使用。也许你接触过CRC32方面的东西,MD5与其何等相似!注意,我用的是何等的相似,而不是说完全一样!只能说它们的某个使用目的是 一致的,而内部的实现却又不一样!我们有时候通过HTTP向服务端上传图片数据的时候,就会要求上传图片流数据的同时,同时要向服务器上传这个图片的CRC32值,服务端接收完图片数据后,进行CRC32校验,看看接收到的图片数据是否完整,这个时候,就会使用CRC32校验!原理和上面的一模一样!这里再顺便说说MD5的缺点:如果你写一个程序,将世界所有语言的各种排列组合(大小写、数字、字符混合、不同长度)生成一遍MD5记录起来,我们不说它的计算时间及难度,那么,任何MD5被用作加密的数据,完全就被破解了!无法防止碰撞,所以MD5对于数据安全性要求极高的系统来说,根本无法满足加密使用用途。当然它本身就不是加密的算法,只是有人强行使用它进行加密用途。MD5、CRC32可以说是完全是单向的,从数据生成特征码,从特征码你无法再通过算法还原原始数据!所以,MD5解密根本无从谈起,就是扯淡,只不过是有些人有碰撞库,进行对比得出原始值而已。
2、对称加密
同一个密钥可以同时用来加密和解密,这种加密方法称为对称加密,也称为单密钥加密.对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。而最常用及被大量使用的就是DES、3DES.
2.1、DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
2.2、3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
2.3、AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
我在网上找到一个图,说明一下单密钥加解密过程:
可以看到,A用一个密钥对数据进行加密后,将加密后的数据送给B,B再用同一个密钥对数据进行解密得出原始明文。这就是对称加密。这里我们思考一下,A有加密算法,B有解决算法,那么是不是可以这样理解:A的加密算法和B的解密算法是公开的!唯一不公开的是你们使用的密钥!是的,没错,对称加密的加解密算法的确是公开的!所以这个时候,密钥的安全是举足轻重的!如果一旦让中间人获取了你的密钥,那么你的数据对于中间人(攻击人)来说,加密就没有意义了!当然你也会问,A、B使用密钥的过程中并没有将密钥传给对方呀,为什么中间人会获取到?我要发送一个保密级极高的数据给B,我打电话告诉B密钥,咱们尚且不说B的职业道德有多高,你怎么能保证B对于工作有没有什么个人情绪?比如频繁出现的程序员删库跑路!从而将你们商定好的密钥泄露给别人?这时候你又会说,那么我每进行一次,就将密钥更换一次,那行,那你得每次给B打电话告诉密钥,你认为这种工作方式是可取的吗?软件系统存在的意义就是提升工作效率,提高生产能力。咱们尚且不讨论这个每次密钥的协商过程,因为这又是另一种加密实现的过程(只是不是当事人进行电话协商),只是说这种方式不可取,人与人频繁的进行交流沟通对于软件系统来说,是没有意义的,更且不说,你保证没有人偷听你俩打电话?道理是一样的。
3、非对称加密
人类总是聪明的,既然对称加密是密钥是单一相同的,那么我们能不能搞个算法或者过程,或者改进一下:我生成一对私密(私有密钥)、解密密钥(公开密钥),无论你用什么办法,你也无法从解密密钥(私有密钥)计算出私钥,在保证此原则的前提下,我把公钥公开!你们使用人全部使用此公钥对于数据进行加密,加密后发送给我,我通过私钥解密,就可以得出原始数据。注意,私钥我一直妥善保管 ,不会告知任何人,并且任何人也无法通过任何方法获取到我的私钥,我的私钥不对外公开,也不对外开放,也不电话告知任何人!这是多么完美的解决方案!对,没错,我现在脑袋很热,确实非常完美,所有人你都有我的公钥,你爱怎么用就怎么用,你爱给谁你给谁,对于我来说,多多益善!并且我还默不关心!并且的并且,你拿着我的公钥加密后只有传给我才是有用的,给传给别人没用!别人的系统中也许对于非对称加密的实现和我的还不一样!你传到别人的服务器上去,根本没用。是不是很perfect!,那么问题来了,这两个公钥、私钥怎么得来!你可能还没有理解,那么你接着往下阅读即可,总有读到某个字的时候,你会恍然大悟!
非对称密码算法有很多,注意,这句话的意思,有很多算法是可以实现非对称加密的!这种很多算法越多,越能保证非对称加密的安全性。如果太单一,反而又会出现撞库解密的机率(即暴力破解)。
我们现在来选择一种较为常用的非对称算法:RSA算法。这个时候,我需要带大家回到我们的童年,当然不是为了唱那首同桌的你或者是青青河边草。我们来想想我们小学的时候对于数字的认识:质数、质因数分解、互质、公约数这些概念。
我在网上找到一张图,1-100之间所有的质数:如下表:
我们重点将互质在这里搬出来重新一起认识一下:
互质是公约数只有1的两个整数,叫做互质整数
例如:
8=2x2x2,10=2x5,它们俩的公约数是2,不是1,因此不是整数互质。
7,11,13的最大公约数是1,因此这几个数互质。
以解完以上概念后,我们来继续认识RSA产生公钥及私钥的整个过程:
●1.随机选择两个不相等的质数p(61)和q(53)。
我选择了61和53。(实际应用中,这两个质数越大,就越难破解。)
●2.计算p和q的乘积n。n = 61×53 = 3233
n的二进制长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。即,实际应用中,我们选择的p和q要相当大,并且是越大越安全,也就意味着越短越不安全
●3.计算n的欧拉函数φ(n)。称作L。欧拉公式φ(n) = (p-1)(q-1)
算出φ(3233)=(61-1)(53-1)=60×52,即3120。
●4.随机选择一个整数e,也就是公钥!!!条件是1< e < φ(n),且e与φ(n) 互质。
1到3120之间,随机选择了17。(你现在想想,1到3120之间与φ(n) 互质的有多少!)
●5.计算e对于φ(n)的模反元素d。得出私钥!
所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。ed ≡ 1 (mod φ(n))
算出来的结果=2753,即17*2753 mode 3120 = 1
●6.将n和e封装成公钥,n和d封装成私钥。
n=3233,e=17,d=2753,所以公钥17,私钥2753。
将公钥17公开,给任何人,并且任何人如果想与你的系统对接,他都可以用。不想做对接,他知道也没有用。因为它拿着这个公钥与其他系统对接,其他系统认为是无效的公钥。你的私钥并没有给任何第三方或者是公开,别人无从得知!也无法通过公钥去还原你的私钥!就是因为第4步你随机选择了与3120互质的数是17,他有17这个公钥,但与17互质的数多了去了!并且上述例子我们还只是选择了12位长度。现实实际中,我们选择的是1024位,甚至是2048位,你算算,要计算出这个私钥,需要多久?即使当他计算出来了,这个时候,又有什么意义?完全已经失去了解密的意义了。所以,计算机加密的安全性,其实就是以时间来衡量的!越让他破解的时间长,越安全!
别人有了公钥,用公钥对数据加密,传到你这边来,你用私钥解密,这就完成了数据安全的传输!
当然,如上所述,非对称加密实现算法不只这一种,不同的服务器可以选择不同的实现方案,这就更加加强了安全性能!到此,如果你已经完全明白本文的陈述,那么恭喜你,学习又进步了。本节讲述到此为止,也不再进行更深的扩展及研究,够我们工作使用了。