加密
数据加密技术现在分为两类,对称加密与非对称加密;
- 对称加密:一个密钥、两种算法(一个加密,一个解密)
- 非对称加密:一个公钥、一个私钥、一种算法
对称加密
对称加密就是使用密钥与加密算法对数据进行转换,得到一些看上去无意义的密文;使用密钥和解密算法对密文进行逆向转换,得到原文。
-
经典算法
DES:采用的是56位的密钥,在以前还是挺强的,因为他只能采用枚举法去破解,但是现在科技越来越发达了,破解的难度也小了,所以已经被弃用了
AES:AES的加密方式就是将明文进行分组,然后将每一组明文都加密得到密文,然后密文拼接起来就是总的密文,加密公式是C=E(K,P) C是密文,K是密钥,P是明文,E表示加密方法;详细的内容呢可以去看看blog.csdn.net/qq_28205153…这篇博客
还有一个常用的是电子邮件加密算法,IDEA(国际数据加密算法),这是由上海交通大学教授与瑞士学者联合提出的
非对称加密
非对称加密就是使用公钥对数据进行加密得到密文,然后使用私钥对密文进行解密,得到原数据;用的加解密算法是一样的,只是区分了公私钥。
用公钥加密的数据可以用私钥来去解密,用私钥加密的数据也可以用公钥来解密,因为他们是同一套算法。说到这里可能会有一个想法,既然都是同一套算法,那么我们的公钥和私钥是不是可以随便用呢?我说它是公钥,他就是公钥,我说他是私钥,它就是私钥?
这里就要非常的注意了,公钥与私钥的定义是不能混了的,从他们诞生的那一刻就决定了谁是公钥,谁是私钥;因为公钥是可以通过私钥计算出来的,所以一定不能乱用
-
经典算法
RSA:密钥长度至少为500位长,计算量很大;可以用来加密,也可以用来签名;详细的可以看看www.jianshu.com/p/fbb8bf7ba…
DSA:一般都是用在数字签名上,它相比RSA祛除了加密的功能,所以他的速度比RSA快很多
-
非对称加密的延伸用途
数字签名:用于验证身份
大概的做法就是我持有一个私钥,然后对数据进行一次非对称加密得到签名数据,然后别人再拿公钥对签名数据进行一次非对称加密,得到未加密的数据
双方通信数据加密:
上面提到的是单纯的用于签名的,那如果我想我与别人相互传输的数据都是进行了加密的,又不会被第三方的不法分子窃取到公钥后乱给我伪造一些数据,那应该如何呢?
这里就需要用到两套非对称加密,假设双方A与B,各有一套公私钥
1、A与B相互交换公钥
2、A对原数据进行Hash,这个哈希值就作为我们的签名数据,然后使用私钥进行加密
3、A对原数据使用交换过来的公钥进行加密,得到密文,然后密文与签名数据一起发给B
4、B收到数据后,先使用自身的私钥对密文进行解密,得到原数据
5、B对签名数据使用交换过来的公钥进行解密,得到签名数据,就是那段Hash值
6、B对原数据进行Hash,然后对比一下两段Hash值是否一致,以验证身份
上面加粗的两个点解释一下
相互交换公钥:不就可以传输的数据都加密了么,但是会存在一个点就是万一我们的公钥被窃取到了,那就会被不法分子伪造数据,乱传,所以才需要加上签名,进行身份认证
进行Hash:进行了Hash的数据就没有这么大了,如果不Hash,那么我就相当于要传输两个原数据,如果原数据大小为10M,那么一次传输就是20M,进行一下Hash,我顶多20M多那么一点点
-
RSA与AES的对比
RSA在安全性上要比AES安全许多,最起码的一点,AES存在密钥被拦截的可能吧,但是RSA就不怂,私钥握在手,公钥你随意,爱咋咋地。但是呢,RSA他的计算太复杂了,所以在效率上要比AES慢很多,记住是很多!
编码
编码这东西与RESTful一样没有人下过明确的定义,我们一般理解的编码就是使用一套固定的规则将数据从A格式变成了B格式,并且还是可逆的,而且不损失任何信息
-
Base64
Base64这玩意很多人会理解成加密,但是实际上,它不是加密,它就是一个编码算法,他是将二进制数据转换成字符串,这个字符串是由64种字符组成的(这里不要有歧义,指的是字符串的每个字符可能是64中字符中的一个,有哪64种可以去看Base64的码表),Base64会将你的数据进行重新编排,把你每个字符的四分之一三(就是6位,一个字符8位),组成一个新的字符,就比如三个字符,他会给你生成出4个字符来,具体生成出的是什么,需要对照Base64的码表
Base64的用途是在对一些非文本的数据转成文本数据时才需要用到,不然是没有必要去用它的,使用了Base64效率还相对低,因为它会将你的数据长度增长三分之一,而且这个也不存在安全可言,就连码表都是公开的
-
URLencoding编码
将URL中的保留字使用百分号进行编码,你在浏览器的地址栏中输入中文,然后复制出来就可以看到了,他的作用就是去消除歧义,避免解析错误,我们都知道URL地址如果带参数会有?&这种符号,而我们传送的参数指不定就会有这种符号呢,那么为了避免解析错误,就有了这种编码
-
压缩
压缩也是一种编码,因为他也是符合我们上面说的那种规则(如果不认同这套规则,那么压缩就不算编码了),别看压缩后的体积变小了,但是他能还原成原本的样子呀,他的体积变小了只是他有特定的压缩算法。
说到压缩,可能就要提到我们另外经常会说的一个点,有损压缩,比如说我们的图片呀,音视频这种,如果进行了有损压缩,那么他就不算是编码了,因为有损压缩他是将数据中的一些东西给删了,比如说一个像素点以0000000000001111111来表示,我进行了有损压缩,我删掉了一点,变成了00000011111(这只是假如),那么他的清晰度就降低了很多,但是我们肉眼还是能辨识出这是一个什么东西,只是没有这么清晰了,但是他的体积就小了很多了,有损压缩是不可逆的,所以他不是编码
上面说到了图片,音视频,就得再提一嘴了,音视频,图片这种也算是编码,比如我们常说的jpeg,png编码格式,我们将图像数据写成png的编码格式,也可以将png编码格式的转成图像数据
Hash
Hash算法就是将任意数据转成一定大小的数据,或者说转换成一个标志,这个标志与原数据的每个字节都有关系,这是一种无法逆向的算法
经典的Hash算法:MD5、SHA1、SHA256等等(记得以后不要说什么MD5加密了,这只是一个Hash算法)
用途:
-
数据完整性验证:就是去对比Hash值是否一致,比如两张图片的Hash值如果一致,那么这两张就是一样的了
-
快速查找:HashMap是去优先比较hashCode()
我们在重写对象的equals的时候一定要去重写hashCode,如果不重写会出现equals相等的情况下,hashCode不相等.
hashCode相等,两个对象未必相等
hashCode不相等,两个对象一定不相等
equals相等,对象一定相等,hashCode一定相等
-
隐私保护:不用明文来保存密码,我对密码做一层hash,因为hash值是不可逆的,所以你就算偷了我的库,拿到了那些hash值也没用(有彩虹表可以对hash做一些反推,所以建议强密码;针对于彩虹表我们可以对我们的密码原数据增加一些其他的数据,添加规则可以自己定一套)