加密、编码、Hash

495 阅读8分钟

加密

数据加密技术现在分为两类,对称加密与非对称加密;

  • 对称加密:一个密钥、两种算法(一个加密,一个解密)
  • 非对称加密:一个公钥、一个私钥、一种算法

对称加密

对称加密就是使用密钥与加密算法对数据进行转换,得到一些看上去无意义的密文;使用密钥和解密算法对密文进行逆向转换,得到原文。

  • 经典算法

    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做一些反推,所以建议强密码;针对于彩虹表我们可以对我们的密码原数据增加一些其他的数据,添加规则可以自己定一套)