2020/03/06 04-密码安全问题和登录接口实现

数据库一般加密方式都是md5,现在md5也非常的不安全了,MD5有大量的人计算,生成了一张表,这张表称为彩虹表,MD5其实可以用更少的位数碰撞来破解

可以在密码和盐算出一个MD5,但是很容易测,因为无非就是前面加盐后面加盐,所以盐加了跟没加一样,这样的做法是固定的加盐,一旦被攻破两个,这个防御基本等于没设置。
试试不规定盐的位置和值

在这里插入图片描述
现在计算机性能足够强,只要能用包里破解的方式,把所有的值建一张表,所以速度快还是可以破解的,所以有些网站登录失败限制5次,还活着提供验证码滑动,组织对方快速穷举这个密码
在这里插入图片描述
所以可以用穷举的方法找到原文,password+salt盐。如何预防包里破解,加一些验证码,活动滑块,阻止自动化程序。
几个方向,在包里破解的时候通过bs方式,在server端加密,一旦把你用户名密码偷走,要暴力破解,只能在算法上阻止算,破不快,降低速度,这样相对密码是安全的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个东西安装好了,就可以用它提供的库做测试
在这里插入图片描述
生成盐gensalt,两次生成的不一样
在这里插入图片描述
这是生成的密码,得到的盐不一样,得到的密文就不一样。
hasepw,第一个值写密码,第二个盐,第三个算法

在这里插入图片描述
就算攻破了一个,得到了盐,也保证不了能攻破下一个
在这里插入图片描述
现在同一个密码,用不同的盐得到两次不一样的结果
在这里插入图片描述
这些密文拿到了,该怎么验证,这4个值都是它生成的,按照道理,能验证,都是true
在这里插入图片描述
现在用同一个盐,用同一个盐,算出来的都是一样的
在这里插入图片描述
这个算出来的一样的值也可以验证

在这里插入图片描述
只要是用hashpw算出来的,最后用checkpw方式都是可以的
在这里插入图片描述
验证是需要把盐的那部分提取出来,然后再做同样的计算,得到同样的结果,因为它的算法也是不可逆的,必须又要给它密码,不给密码也没辙,得到密码后把盐提取出来,盐提取出来后,再做一次验证,看是否一致

计算的时候感觉有些慢
在这里插入图片描述
测试下实际的时间,第一次看加密时间,第二次看解密时间
在这里插入图片描述
加密和解密的时间同样耗时,加上一些措施,暴力破解的速度更加慢
在这里插入图片描述
这一块确实比md5慢的多,大多数用户登录就那么一下,验证一下密码就用checkpw,在生成密码,临时注册的时候在用那么一下,所以用它没有问题。同样的盐加出来的东西一样,但是不同的盐生成的东西不一样,也可以用checkpw来验证

不管是加密或者解密,时间基本相同
在这里插入图片描述

这个密文里有盐,然后加密出东西
在这里插入图片描述
不同的加密算法前缀是不一样的

在这里插入图片描述
后面占两个部分,22个字符是盐,采用base64编码,密文是31个字符,采用 base64编码。所以有时候被撞库,是用户自己密码跨域一样导致的。
有时候就用红外扫描来攻破

在这里插入图片描述
这两种介绍完,就需要修改自己的代码了,依然是user,views模块,reg函数
在这里插入图片描述
密码的时候需要加密

在这里插入图片描述导入一下库,这两个都需要使用 在这里插入图片描述
有一个secret,密钥需要自己设置,django提供了足够强的密钥,但是需要我们去拿,该怎么拿,从setting里拿,就要看里面放到 是什么
在这里插入图片描述
打印settings里看看
在这里插入图片描述
这是注册的

在这里插入图片描述
启动服务

在这里插入图片描述
故意用存在的用户名试一下

在这里插入图片描述
这里是lazysettings
在这里插入图片描述
看一下这个lazysetting是什么在这里插入图片描述
在这里插入图片描述
里面有这些属性直接访问即可,getattr是找不到的时候用,从 包装里找一大堆东西
在这里插入图片描述
settings里有secret key在这里插入图片描述
现在就调用属性

在这里插入图片描述

再发送一遍
在这里插入图片描述
拿到key 了,

在这里插入图片描述
也就是还是通过getattr来实现的,通过这样就拿到了值
在这里插入图片描述zg
这个值就是key
在这里插入图片描述
有了key下面就是加密的问题了
在这里插入图片描述
用户登录成功需要用到session技术,现在保障数据要发到服务器端,要个唯一id,为了防止篡改这个值,就需要用jwt,sessionid其实用户再客户端可以改,服务器一查表,sessionid没有就不理你,就要重新给你发一个sessionid。session可以解决一定的安全问题,但是不能解决欺骗的问题,要依靠csrf来解决。
用session解决无状态的问题,jwt是不用session来解决有状态,jwt要把这个写进去,将字典json化,把header json,payload负载json,将两个转base64编码用点好链接,这一部分作为输入开始千米给signature

在这里插入图片描述
这个key是上面拿到的django的密钥

在这里插入图片描述
后面要指定一下算法

在这里插入图片描述
把这一部分抽象出来,变成一个函数
在这里插入图片描述
生成一个jwttoken
在这里插入图片描述
上面可以之家把数据进行包装,这一块就是一个字典,201一般是增加成功之后喜欢201,restful风格,直接在里面连编码一块解决了

在这里插入图片描述
save之后会查一把,id就知道,有这个id直接可以传给它,再把jsonresponse返回给浏览器端
在这里插入图片描述
这样就把用户登录的问题解决了,这样用户就拿到了一个jwt的token,这个token不能篡改,在提交过来的时候要做验证,凡是验证不合格就不允许登录
在这里插入图片描述
思路是,1.用户提交的数据通过json的方式提交过来,将body的数据做json化,json拿到之后就可以提取里面的内容,email先查一下,如果已经存在就告诉用户名已经存在
在这里插入图片描述
如果用户名不存在,可以继续向下,把用户名称,密码信息该收集收集,密码采用每一次混入不同的盐加密放入客户端这样才能保证安全
在这里插入图片描述
保存完,要给用户发信息,这个信息是可以给发一个token,也可以不发送

在这里插入图片描述
可以这么做,不用token也可以,登录成功了才发token,登录不成功就不发令牌token,有的网站登录成功后才标记成功。有的网站注册好直接登录了,下面发的token就是为了免登录的。
刚才直接发token,就代表注册完免登录了,但是要验证

在这里插入图片描述
返回userid,只能返回已经注册成功,如有需要登录本网站,如果发token,就可以通过验证不登陆了
在这里插入图片描述
新用户
在这里插入图片描述
试试如果返回这样的信息该怎么样
在这里插入图片描述
这里字符串要encode
在这里插入图片描述
拿到一个reason在这里插入图片描述
这里面有一些错误
在这里插入图片描述
insert已经成功了在这里插入图片描述
虽然出现了异常还是保存了

在这里插入图片描述
再增加一个用户

在这里插入图片描述
这里忘记decode了,这里拿到的结果应该是一个bytes
在这里插入图片描述
decode一下变成bytes

在这里插入图片描述
把加的记录删除掉

在这里插入图片描述
这样就拿到token了
在这里插入图片描述
前面用base64解开就知道对方的userid了,也知道加密算法,但是不能修改,改了把这个值发出去就出问题了

在这里插入图片描述
这一块返回什么可以自己决定,登录成功就发token,需要重新登录就简单发一些数据,甚至发生一个状态码即可

在这里插入图片描述
这就是用户注册业务如何修改,注意用户名冲突如何解决,密码如何做到安全,如果发送数据到客户端,有没有第三种解决方案(jwt)jwt不一定做单点登录,如果想把一些数据带过去带回来,完全可以放jwt,而且jwt还防篡改
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值