在用户端进行请求的时候,如果要上传一些敏感数据,比如用户的密码,身份证号,银行卡信息时一般是需要进行加密,以用户的登录密码为例,说下HMAC加密的过程.
先说原理 : 通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值。md5是应用非常广泛的哈希算法.其他的还有SHA-1,SHA-256,等等都行.
从注册开始
1.1用户点击了注册 , 客户端拿着账号请求服务器,服务器需要先校验此账号是否存在 , 如果不存在返回一个字符串,我们先叫这个字符串salt(盐),
1.2客户端拿到了salt,然后把密码输入框的密码和salt进行md5,然后把md5(pwd+salt)的结果给到服务器,服务器保存这个结果作为pwd_md5.注册完成,客户端把salt写入本地的磁盘中.
用户登录的操作
2.1用户点击了登录,客户端先检查本地是否保存了salt,如果没有保存(比如用户换了手机登录,或者彻底删除了应用,然后又下载了),在找服务器获取salt,然后使用md5(pwd+salt)加密获得一个字符串,也叫pwd_md5,
2.2现在客户端有了pwd_md5 , 但是如果每次都以这个字符串上传的话,这个字符串是固定不变的,黑客就不需要你的pwd,直接截取到这个字符串,然后就能模拟你的登录了 , 所以每次给服务器的这个串得是变化的 ,
2.3 客户端需要在pwd_md5的基础上,在加入一个随机的字符串的md5,这个随机字符串得是服务器给的 , 有效时间为2分钟 , (一般会取时间戳,时间戳到分钟,不能是本地时间), 变成了md5(pwd_md5+随机串) , 然后把这个md5(pwd_md5+随机串)+账号 上传给服务器,
2.4 服务器拿到了客户端的账号和md5(pwd_md5+随机串)后 , 从数据库取出此账号注册时的pwd_md5 , 然后还有上个接口返回的随机串 , 也用同样的规则 md5(数据库的pwd_md5+随机串)生成一个字符串, 如果是时间戳的话,校验当前分钟和前一分钟 , 最后本地生成的字符串和客户端上传的字符串进行校验,如果匹配成功,则登陆成功.
用户重置密码
3.1经过手机号的验证码,或者邮箱校验后,确认了用户身份 , 输入了新的密码 , 然后和登录操作类似 , 服务器重新生成一个salt,返回给客户端
3.2客户端拿到salt,然后把密码输入框的密码和salt进行md5,然后把md5(pwd+salt)的结果给到服务器,服务器保存这个结果作为新的pwd_md5.重置密码完成.
注意 : 注册和重置密码的时候是不需要服务器的随机串(一般为时间戳)的 , 这个随机串只在登录时加入.
在整个过程中,可能遭到网络攻击的是服务器返回的随机值,salt和用户发送的结果,而对于截获了这些值的黑客而言这些值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。
嗯,结束.