文章仅供课后复习,感谢hank老师。
HASH概述
Hash,一般翻译做“散列”
,也有直接音译为“哈希”的,就
是把任意长度的输入通过散列算法变换成固定长度的输
出,该输出就是散列值。这种转换是一种压缩映射,也
就是,散列值的空间通常远小于输入的空间,不同的输
入可能会散列成相同的输出,所以不可能从散列值来确
定唯一的输入值。简单的说就是一种将任意长度的消息
压缩到某一固定长度的消息摘要的函数。
HASH的特点
- 算法是公开的
- 对相同数据运算,得到的结果是一样的
- 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
- 没法逆运算
- 信息摘要,信息“指纹” ,是用来做数据识别的
HASH的用途
- 用户密码的加密
- 搜索引擎
- 版权
- 数字签名
密码加密
密码是不能以任何明文方式存储。所以通过运用HASH算法,给用户的密码进行加密。
- 直接使用md5加密(不安全)
- md5加盐(如果暴力破解盐,此方法也不安全)
- HMAC加密方案(推荐)
- 添加自己的加密逻辑(推荐)
HMAC加密方案
- HMAC加密
- 使用一个秘钥加密数据做两次散列
- 秘钥来自服务器
- 发送一个账号,服务器生成一个key(秘钥),服务器保存帐号,账号对应的key,key给客户端进行明文加密(HMAC密码),发给服务器保存,注册成功
- 使用已经存在的key(秘钥)对帐号加密,带着key、HMAC密码、服务器时间戳,帐号区服务器验证
- 由于加入时间戳的限制,往往破解,仅能在1-2分钟执行尝试登陆
- 单纯的破解key,只能对单个账号存在风险, key泄漏只是一个用户的
数字签名
签名就是用来这个东西是你的,你在支票上签名,就证明支票是你的。那么数字签名,就是用于鉴别数字信息的方法。所以数字签名就包含了签名+验证,防止被篡改。
之前上一章讲过RSA加密,公钥、私钥、非对称加密。
在做数字签名的时候,往往不直接使用私钥对明文进行签名。但是单纯的使用RSA加密又不能满足我们的需求。之前我们提过,RSA只适合用于小数据加密。所以我们要用到HASH算法来验证数据的完整性,再用RSA加密算法对HASH数据进行保护。
此时客户端发送原始数据,和经RSA加密后的该数据的hash值。服务器对RSA加密的数据进行解密,得到原始数据的hash值,接下来对原始数据进行同样的Hash算法,将得到的Hash值和解密后的Hash值做对比,如果一致则保证数据有效性,整个过程中,如果解密的Hash值和原始的Hash值不一致,或者无法解密RSA的数据,都说明数据被篡改了。
所以我们说,对原始数据Hash值进行RSA加密后的数据,是原始数据的数字签名。其实就是对原始数据的Hash值进行非对称加密。
对称加密
对称加密方式:明文通过密钥加密得到密文。密文通过
密钥解密得到明文。
常见的算法
- DES 数据加密标准(用得少,因为强度不够)
- 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强(刚出生就over)
- AES 高级密码标准。(钥匙串访问)
应用模式
- ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密
码本重放攻击,一般情况下很少用。
- CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[iv]执行加密
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形
成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后
续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
多说一句,CBC防窃听方案常用。
终端命令
加密,AES(ECB)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64解密,AES(ECB)解密
$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt –d加密,AES(CBC)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64解密,AES(CBC)解密
$ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K
616263 -nosalt –d