本文共 2687 字,大约阅读时间需要 8 分钟。
数据库一般加密方式都是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还防篡改转载地址:http://yozgn.baihongyu.com/