密码学之—Hash&对称

概述

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的用法

用户账号密码的加密

实际项目中本地和服务器不可保存用户密码,具有泄漏用户信息的危险。当然简单的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值就能判断真伪。

百度云重复文件的判断

上传重复文件的时候会提醒已经有了是否还要上传。这就是用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解码,再解密

 */

你可能感兴趣的:(密码学之—Hash&对称)