二 密码学-HASH&对称
在上一篇文章,讲述了非对称加密,也就是RSA的数据原理和简单实用,那么在这篇文章将要讲述的就是对称加密,其中以Hash(散列算法,哈希函数)最为广为人知。
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
接下来本文会从以下几点进行阐述:
- HASH概述
- 密码加密
- 数字签名
- 对称加密
1.HASH概述
1.1常见的3大类加密算法:
- 哈希(散列)函数
md5、SHA1/256/512
HMAC(不是加密算法,是一种加密方式) - 对称加密
DES
3DES
AES(高级密码标准) - 非对称加密
RSA算法
1.2 Hash的特点:
- 算法是公开的
- 对相同的数据运算,得到的结果是一样的
- 对不同的数据运算,如MD5得到的结果默认是128位(32个字符,16进制表示)
- 没法逆运算
- 信息摘要,信息‘指纹’,用来做数据识别
1.3 Hash的用途:
- 用户的密码加密 (登录逻辑处理)
- 搜索引擎
- 版权
- 数字签名
2.密码加密
用户密码的二个原则:
- 网络上不允许明文传递用户隐私信息
- 本地不允许明文保存用户隐私信息
2.1 Hash简单使用
三种加密方式:
- 密码MD5
- MD5加盐
- HMAC 加密方案
三种加密方式对比
MD5 | 不够安全了。可以反查询! |
MD5加盐 | 盐是固定的,写死在程序里面,一旦泄露就不安全了! |
HMAC 加密方案 | 1.使用一个密钥加密,并且做两次散列!2.在实际开发中,密钥(KEY)来自于服务器(动态的)!3.一个账号,对应一个KEY,而且还可以更新! |
加密理解:
- 普通的Hash因为存在散列碰撞的问题,所以简单的对密码HASH(例如MD5),肯定不够安全。推荐网站:反MD5网站
- 固定盐:既然简单的Hash不安全那么进一步可以想到将密码通过固定的算法转换一次,在进行Hash,也就是我们俗称的加盐。这种方法看似安全,但由于算法固定,那么实际上接触过这个算法的人员还是蛮多的,就比如写这串算法的程序员,一旦程序员离职,那么算法也就变的不在安全。
-
动态盐(HMAC)+ 时间戳:最后,就是要让每次用户的token不一样,那么可以采用,动态盐+时间戳的方式进行最终的验证。也就是(HMAC哈希值)+”201902281250”).md5
最终服务端用也用同样的的方式校验,唯一不一样的是考虑到服务传递的延时,时间戳也要考虑到上一分钟的情况。如下图:HMAC+时间戳
HMAC+时间戳.png
参见代码ReverseEncrypt1 Hash简单使用
3.数字签名
对原始数据的HASH值用非对称加密,我们称之为数据签名。
具体文章参考:
作者:请叫我Hank
原文地址:https://www.jianshu.com/p/02034d1a91b5
原文地址:https://www.jianshu.com/p/3c9e2055ae5b
4.对称加密
对称加密方式:明文通过密钥加密得到密文。密文通过密钥解密得到明文。
常用的对称加密分为三种:
方式 | 含义 |
---|---|
DES | 数据加密标准(用得少,因为强度不够) |
3DES | 使用3个密钥,对相同的数据执行3次加密,强度增强 |
AES | 高级密码标准 |
4.1 对称加密算法的2种加密模式
其中AES为现在的的主流加密方式,AES有具体分为ECB和CBC两种加密模式:
-
ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
-
最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
-
CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
-
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
特点:CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
4.2 终端命令
加密:
AES(ECB)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
AES(CBC)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
解密
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
4.3 代码演示
参见代码ReverseEncrypt2 对称加密
使用CCCrypt加密的安全隐患:
1. 通过条件断点可以获取到系统的加密函数
总结
参考文章:
作者:一缕清风扬万里
原文地址:https://www.jianshu.com/p/4a920586a01f
作者:请叫我Hank
原文地址:https://www.jianshu.com/p/02034d1a91b5