常用加密
- RSA 非对称加密
- hash 散列函数,结果都是32位字符串,运算不可逆。md5,sha1,sha256。
- 对称加密 DES,3DES, AES(高级加密算法。目前常用的加密算法,比如很多硬盘都支持AES128加密)
加密的演进
明文传输。
非常不安全,服务器直接保存密码。这样一旦泄露,后果非常严重。
username = @"xiaoming"
password = @"123456"
hash传输
用户名还是明文。但是传输的过程对password进行hash运算。服务器也保存密码对应的hash。这样就算得到hash,也不能逆向解密。
但是www.cmd5.com 该网站收录了很多hash。此时密码又不安全了
hash+盐
盐是一长串的字符串。校验密码为 原始密码拼接盐。然后再md5。这样可以有效防止破解。
此时,盐的泄露会比较危险。比如拿到了盐。可以随机生成字符串然后加盐,然后md5运算和拦截到的校验密码进行匹配。
HMAC
注册的时候,服务器针对每个用户生成一个key。然后将key发送给客户端。客户端根据这个key对密码进行加密。然后把加密后的字符串发送给服务器。服务器拿到这个字符串保存。或者下次登录的时候进行密码校验。
优点: 一个key对应一个用户,泄露了一个key对其它用户没有任何影响。
缺点:key的传输是不安全的。
设备锁
目前的apple登录,QQ登录都有设备锁的概念。
用户知道账号和密码。要获取HMAC对应的key.但是如果用户之前在其它设备登录过,则先请求其它登录设备,是否允许改设备进行登录。如果不允许,就无法登录。
破解HMAC
比如搞活动,注册app送奶茶。但是下载app需要流量,可以通过提供免费的wifi让用户下载。此时用户的所有的流量都通过你的wifi。
虽然我们无法获取QQ的原始密码。但是可以获取QQ进行HMAC之后的密码。这个密码是用于密码校验的。因此密码也是不安全的。
HMAC防破解
校验密码:(用户HMAC密码+ "2020-10-1 09:10").md5
服务器保存的是用户的HMAC密码。服务器校验的时候,先获取当前的分钟拼接服务器保存的HMAC密码。然后再MD5。此时和用户的数据进行校验。
如果校验失败,则服务器获取上一分钟的时间。再重复操作。用户对应的校验密码只有2分钟的有效期。下次再根据这个密码,就无法登录了。
这个时间戳,注意需要使用服务器的时间。如果使用本地的时间,用户的时间不对则无法登录成功。
数字签名
由于RSA非对称加密效率很低,因此在进行数据传输的时候,一般不直接使用公钥和私钥进行加密和解密。
对数据进行md5(md5的效率非常高)。然后对32位的md5进行公钥加密。
服务器接收到的数据就是原始数据+公钥加密后的数据。服务器再次对数据进行md5。然后使用私钥解密secret。如果此时md5和解密后的secret一致,则证明数据没有没篡改。
{
user:"xiaoming"
update_addr:"beijing"
secret:"adasdasd"
}