概述
1. 对称加密:指加密和解密使用相同密钥的加密算法,它用来对敏感数据等信息进行加密。常用的包括(DES、3DES、AES、DESX、Blowfish、RC4、RC5、RC6)
2. Hash:也称为散列算法,特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标数据生成一段特定长度(128字节)的唯一hash值,但不能通过hash值重新获得目标数据,因此hash算法常用在不可还原的密码存储,信息完整性校验等。常用的包括(MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1)
hash详述:
1. Hash的特点
1. 算法是公开的
2. 对相同数据运算,得到的结果是一样的
3. 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
4. 这玩意无法逆转运算
5. 是用来做数据识别的
2. Hash的用法
1 用户账号密码的加密
实际项目中本地和服务器不可保存用户密码,具有泄漏用户信息的危险。当然简单的Hash算法也是不安全的,如下图两种方式,上面的也是很多用户量小的app的密码加密方式,实际是不可取的,安全系数比较低,下面的HMAC加密方式相对安全很多。
分析一下HMAC加密方式:
先看图
简述一下步骤:
1. 客户端A开始注册,使用用户名Feiyang请求服务器。
2. 服务器返回一个随机的key给客户端,这个key是一个用户一个key
3. 客户端在本地钥匙串保存这个key,再用这个key对密码进行加密,加密后发送给客户端账号和加密后的密码进行注册,以后在本机上登录使用本地保存的key加密密码再传给客户端登录。
4. 服务端保存key,用户名,加密后的密码。
5. 客户端B登录本账号,需要先判断本地是否有登录的key,没有则向服务求请求获取key。
6. 服务器收到客户端B,获取key的请求时,这个时候要么直接给客户端B的key,也可以再做个权限获取请求,给客户端A发送一个另一提机器登录请求的推送,如果客户端A给了这个权限就将key发送给客户端B。
7. 客户端A授权后,服务器给客户端B返回key,客户端B保存key并加密密码登录。
总结一下:
上面这个方式,首先是使用了动态key,另外可以进行两次散列算法,获取到的key,加密后再拼接密码再次散列解密。具体获取到key之后怎么加密,自己看着办吧。这样就算黑客获取到你key,也是很难破解你的密码的,就算破解了,也只是某一个用户的,这样费时费力不是马爸爸的账号应该也不会去做了。
细心的朋友应该可能会有这个疑问,就算做了这一系列操作,最后登录时总是用户名和加密后的密码,这是不会变的,如果黑客拦截到这条信息,还是能够登录的。
不慌,继续往下看。
如图
解答上面的疑问: (时间戳到分钟,如现在是20年10月26日22点34分:202010262234)
1. 在我们的密码加密后,在做一步操作,将密码的hash值再与此时的时间戳进行拼接,拼接后再进行md5加密,后传给服务器。
2. 服务器做相同的操作,此时时间走了一点,可能到22点35了,此时判断密码不对,再将时间减去一分钟,22点34,密码正确,登录成功。
这样我们会发现,就算黑客拦截了用户名和加密后的密码,也只能在这二分钟内能够登录成功,安全性将再次变高。
所有加密都不可能做到完全不被破解,尽量提高安全性才是我们应该要做的。
2 搜索引擎
服务端将根据不同的搜索关键字进行单个以及组合(组合可以是单个关键字hash值之和,这样就没有顺序之分)的形式生成hash表,此hash表对应服务端的一个文件,这个文件就是这些关键字搜索出来的。
3 版权
对于版权的hash用法 比如在某个视频网站上你上传了一段视频,此视频在保存时会生成一个hash值,之后别人下载的时候都是复制后的视频,当有人冒充正版的时候,直接对比hash值就能判断真伪。
4 百度云重复文件的判断
上传重复文件的时候会提醒已经有了是否还要上传。这就是用hash值来判断的,因为上传的文件可能很大,不可能一一对比。
5 数字签名,如图,因为RSA加密大数据性能很低,所以先进行hash后再RSA加密。
对称加密详述
DES 数据加密标准(用得少,因为强度不够)
3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
AES 高级密码标准。
讲述一下AES,AES介绍两种应用模式
ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
特点:
最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
特点:
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
这边分享一下终端测试命令
hello : 加密字符串
616263 : key 字符串“abc”的ASCII
0102030405060708 : 初始化向量[IV]
/**
* 终端测试指令
*
* DES(ECB)加密
* $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
*
* DES(CBC)加密
* $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
*
* AES(ECB)加密
* $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
*
* AES(CBC)加密
* $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
*
* DES(ECB)解密
* $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
*
* DES(CBC)解密
* $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
*
* AES(ECB)解密
* $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
*
* AES(CBC)解密
* $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
*
* 提示:
* 1> 加密过程是先加密,再base64编码
* 2> 解密过程是先base64解码,再解密
*/