Hash,通常翻译作“散列”,也有直接音译为“哈希”的,就是把任意长度的输入经过散列算法变换成固定长度的输出,该输出就是散列值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数算法
既然hash的运算结果是定长的,那么必然会出现多个数据的hash相同的状况,这被叫作散列碰撞安全
md5 001.png"
输出的hash值为MD5 (001.png) = 794f38b127db2e24e23a59d1fcb7a700
复制代码
修更名字+后缀名为“md5 002.mp3”,终端命令md5 002.mp3"
输出的hash值为bash
MD5 (002.mp3) = 794f38b127db2e24e23a59d1fcb7a700
复制代码
修改回“001.png”,Ctrl+C Ctrl+V复制一份图片,命名为“002.png”,终端命令md5 002.png"
服务器
MD5 (002.png) = 794f38b127db2e24e23a59d1fcb7a700
复制代码
将图片打包成“001.zip”,终端命令md5 001.png.zip
网络
MD5 (001.png.zip) = eca9687c64a1a62154582186214a97be
复制代码
上述操做得出几个结论: ① 修改文件名或后缀名不会改变其二进制(hash值),后缀名实际上是给操做系统看的——让操做系统判断用什么软件打开它 ② 复制粘贴的本质是对二进制的复制粘贴 ③ 只有压缩操做才会改变二进制app
因为hash运算的不可逆,让它在不少领域都大放异彩函数
若是直接用明文传输密码,黑客能直接抓取到网络请求,用户密码会“一丝不挂”的出如今黑客面前;又若是使用RSA加密传输,客户端加密服务器解密,岂不是美滋滋?可是用户密码仍是会明文保存在服务器端,这样是很不安全的!!! 互联网有两个原则:① 网络传输不容许明文传递用户隐私信息;② 本地不容许明文保存用户隐私信息网站
那么直接使用MD5加密用户密码呢?或许不少小型外包就是这么处理的,但这种方案也是很不全的,由于hash算法是不可逆的。只要穷举千千万万种hash算法的结果,而后再进行反向查询,用户的密码也会垂手可得会拿到,好比www.cmd5.com/这个网站 搜索引擎
加盐是什么意思呢?就是在用户的明文密码后面加一点“做料”——一串奇奇怪怪的字符串,而后再作hash运算,好比“123456da.gjio1ra”再作MD5运算发送给服务器。 这种方案的用户密码不能简单快速的破译出明文密码,可是也能经过暴力破解。与之同时带来一系列的危害:破解出明文密码,也就知道了盐,由于盐是写死的,那么全部用户的密码也均可以垂手可得的破解出来,因此在这种方案中对“盐”的保护尤其重要。其次,各个客户端、服务器都知道“盐”的具体内容,那公司能保证全部开发工程师离职了不透露出去吗?咱们作开发的应该作到尽善尽美,不能让这些人为因素影响咱们的app安全! 既然写死“盐”不行,那么咱们能够用动态盐来解决问题加密
HMAC是使用一个密钥加密,而且作两次散列运算,获得一个hash值。它是一种方案,不是加密算法。在实际开发中HMAC的密钥来自于服务器,是随机的,每一个帐号各不相同 接下来经过多种登陆状况理一下登陆逻辑:
① 注册
帐号Feng
发送给服务器
b. 服务器对帐号Feng
进行校验,若是可用的话,随机生成一个密钥key
发送给客户端
c. 客户端对进行HMAC,再将帐号+密码发送给服务器,服务器将帐号Feng
+密钥key
+密码hmac
一一对应保存。而后返回注册成功的请求结果,客户端就能将密钥key
存储起来了
这样子一个帐号对应一个密钥,大大提升了登陆安全性。可是想一下万一用户换了台设备登陆,那不是拿不到key了?因此咱们还得丰富一下咱们的登陆逻辑
② 换设备登陆
帐号Feng
发送给服务器并请求
密钥key
b. 服务器对帐号Feng
进行查找,将帐号对应的密钥key
返回给客户端
c. 客户端对明文密码hmac获得密码hmac
,将帐号Feng
+密钥key
+密码hmac
发送给服务器。若是服务器帐号密码匹配成功,客户端将密钥key
保存;反之不能保存
③ 设备锁业务
b. 服务器询问原设备A是否开始设备锁,若是没开就自定发送key给B;若是开了就向设备A访问权限,A赞成了才能发送
c. 服务器对帐号Feng
进行查找,将帐号对应的密钥key
返回给客户端
d. 同②-c
HMAC的加密方案已经至关安全了,可是客户端发送给服务器的密码照样能被截取到,第三方只要帐号、密码一匹配就能简简单单登陆,因此咱们要对网络请求数据进行一些处理,咱们采用的方法是加时间戳:
a. 发起登陆请求
b. 服务器返回时间戳给客户端
c. 照着(HMAC哈希值+时间戳).MD5
进行运算,这里的时间戳不是本地的系统时间,而是发起登陆请求时服务器返回给客户端的时间戳(只取到分钟)而后将HMAC密码拼接上时间戳,再次进行MD5发送给服务器
d. 服务器也用一样的算法进行运算,先匹配同一分钟的哈希值,匹配不成功再匹配上一分钟的哈希值
这样作可以让用户的密码随着时间变化而变化,黑客只能在最多两分钟内使用截获到的密码(最少1分01秒,最多1分59秒)
数字签名,就是只有信息的发送者才能产生的别人没法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证实。
图文并茂才能更好地阐述观点——xx去银行取十块钱的过程
b. 银行给了你10元
c. 用户拿到10元
b. 黑客修改:“用户要取20元”
c. 银行转出20元
d. 黑客拿到10元,用户拿到10元
b. 使用RSA对HASH值进行加密(数字签名)
c. 将原始数据+数字签名,一块儿发给服务器验证 黑客没有私钥,不能对其进行解密; 传输过程当中,没有密钥传递; hash值判断原始值有无修改
注:加密数字信息叫数字签名,加密代码叫代码签名,加密引用叫应用签名
非对称加密被叫作现代加密算法,对称加密算法则叫作传统加密算法
对称加密算法
来讲,密钥的保护本就尤其重要,3DES使用三个密钥对密钥保管更加不易message.text
123456123456123456
123456123456123456
123456123456123456
123456123456123456
复制代码
openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin
用DES加密,选择ECB应用模式,密钥为616263,不加盐message.text
,最后一组123456->223456123456123456123456
123456123456123456
123456123456123456
123456123456223456
复制代码
xxd msg1.bin
和xxd msg2.bin
openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg3.bin
openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg4.bin
用DES加密,选择CBC应用模式,初始化向量为0102030405060708,密钥为616263,不加盐xxd msg3.bin
和xxd msg4.bin