查了好久好久的资料,现在脑子真是不好使,总是爱忘记,前脚查后脚忘…他妈的…查了那么多东西也没真的理解透彻,最后在一位大佬的帮助下算是把流程理清楚了.说的不一定对.
参考资料1 概述
这里只写一个简单的流程就够了.
注册时候:
RSA加密算法加强密码传输时候的安全>
前端公钥加密>
后端私钥解密得到明文密码>
明文密码加盐
,信息摘要算法
>
数据库存储盐
和加密后的密码
这里并未涉及如何防止表单重复提交的问题.(其实我感觉重放攻击和防止表单重复提交的过程差不多…)
RSA加密可以使得传输层的信息不被篡改,注意只是篡改,就是能防止信息的劫持,因为劫持了也没什么用,但是不能防止重放攻击,
就是第三方可以拿一个一模一样的请求再次发送(比如说删除请求),那么就可以删除对应的东西了.为了防止这一点,可以选择使用timestamp和nonce的方案 timestamp和nonce,
同时百度查得知还有使用Redis Redis1 Redis2好像也可以防止重放攻击,需要进一步了解.
登陆过程:
RSA对明文密码进行加密传输>
后台解析出明文密码>
取出数据库中盐和加密后的密码>
根据盐再次计算>
对比验证
数据库需要同时存储盐和加密后的密码,在验证的时候就需要取出来对应的盐和密码, 客户端解密得到的明文密码 + 取到的盐再与取到的密码进行验证,通过则返回一个登陆认证token
登陆认证token
也有一点需要注意,那就是token的加密是为了在保存的cookie的时候不被篡改.因为第三方其实可以拿到cookie,但是拿到也没用,因为篡改了就认证不通过.
这里我自己觉得还是防止重放攻击最重要
token
认证过程
token
的加密其实我还是存在一些疑惑,加密其实都在token
三部分的第三部分上,第一第二部分都是公开的信息,然后第三部分是服务器端根据第一部分,第二部分的信息加上服务端的密钥进行加密之后得到的.
验证的时候的计算原理>
前端传送Cookie值带着这个token>
后端将token
的第一第二部分取出来和服务端存在的密钥一起再次进行计算得到一个新的第三部分>
计算的值和前端发送的token
的第三部分进行验证对比>
结果
XSRF攻击防范
Angular官方给出的一种方法就是这种,即在应用加载的时候就立马发送一个请求到服务器,服务器设置一个XSRF-TOKEN给Cookie,具体原理不懂,这里的XSRF-TOKEN需要每个用户都不同.
理解里和登陆Token是两码事,需要分别放两个Token,一个用于防范攻击,一个用于登陆验证.