一、哈希算法
哈希:
给定明文-计算出一段定长的-不可逆的值
定长输出:不管明文输入多少,哈希都是定长的
不可逆:无法反向计算出对应的明文
雪崩效应:输入改变,输出必然变
md5:32位16进制
 
场景:
1.密码处理
2.文件完整性
 
用法: import hashlib
import hashlib m = hashlib.md5()  #1.生成哈希算法的计算对象
 
m.update(b'明文串') #2.传入要转换的字符串,必须声明bytes对象
 
m.hexdigest()   #3.输出对应的hash值,十六进制可视字符
 
m.digest() #3. 输出不可视的hash值 #如果要算一个新的值,需要生成新的update对象,不然会将前后的明文拼接起来输出哈希值
 
 
 
 
二、登录交互流程图
 
三、models/视图简单实现
class User(models.Model):
username = models.CharField('用户名', max_length=30, unique=True)
password = models.CharField('密码', max_length=32)
create_time = models.DateTimeField('创建时间', auto_now_add=True)
updata_time = models.DateTimeField('更新时间', auto_now=True) def __str__(self):
return f'username:{self.username}'

  

def register_view(request):
if request.method == 'GET':
return render(request, 'user/register.html')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
password_verify = request.POST.get('password_verify')
# 判断两次密码是否一致
if password != password_verify:
return HttpResponse('两次输入密码不一致')
# 当前用户名是否可用
old_users = User.objects.filter(username=username)
if old_users:
return HttpResponse('当前用户名已经注册')
# 哈希算法转换密码
hash = hashlib.md5()
hash.update(password.encode())
hash_pwd = hash.hexdigest() # 插入数据
try:
user = User.objects.create(username=username, password=hash_pwd)
except Exception as e:
# 有可能报错,重复插入 唯一索引注意并发写入问题,所以有唯一索引一定要try一下
logger.error(f'register create user info {e}')
return HttpResponse('当前用户名已经注册') # 存储 session / 免登录一天
request.session['username'] = username
request.session['uid'] = user.id
# 修改session 有效期为1天
return HttpResponseRedirect('/index') def login_view(request):
if request.method == 'GET':
# 检查登录状态,如果登录了,显示已登录
if request.session.get('username') and request.session.get('uid'):
return HttpResponseRedirect('/index') # 检查cookie
c_username = request.COOKIES.get('username')
c_uid = request.COOKIES.get('uid')
if c_username and c_uid:
# 回写session
request.session['username'] = c_username
request.session['uid'] = c_uid
return HttpResponseRedirect('/index') return render(request, 'user/login.html')
if request.method == 'POST':
# 处理数据
username = request.POST.get('username')
password = request.POST.get('password')
# 比对用户名
try:
user = User.objects.get(username=username)
except Exception as e:
logger.error(f'longin user {e}')
return HttpResponse(f'用户名或密码不正确') # 判断密码
# 哈希算法转换密码
hash = hashlib.md5()
hash.update(password.encode())
# 密码比对
if hash.hexdigest() != user.password:
return HttpResponse('用户名或密码错误')
# 记录会话状态
request.session['username'] = username
request.session['uid'] = user.id
# 判断用户是否选中了记住当前用户
# -> cookies 存储username.id 3天
resp = HttpResponseRedirect('/index') if 'remember' in request.POST:
resp.set_cookie('username', username, 3600 * 24 * 3)
resp.set_cookie('uid', user.id, 3600 * 24 * 3) return resp def logout_viwe(request):
if 'username' in request.session:
del request.session['username']
if 'uid' in request.session:
del request.session['uid']
resp = HttpResponseRedirect('/index')
if 'username' in request.COOKIES:
resp.delete_cookie('username')
if 'uid' in request.COOKIES:
resp.delete_cookie('uid')
return resp
 

19.-哈希算法&注册登录的更多相关文章

  1. vue2.0+koa2+mongodb实现注册登录

    前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: "不要把自己禁锢在某一个领域,技术到产品的转变,首先就是思维上的转变.你一直做前端,数据的交互你只知道 ...

  2. Django+bootstrap+注册登录系统

    转自:https://www.cnblogs.com/robindong/p/9610057.html Robin_D 博客园 首页 新随笔 联系 订阅 管理 随笔 - 10  文章 - 0  评论 ...

  3. Spring Security 的注册登录流程

    Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...

  4. 原生js验证简洁美观注册登录页面

    序 一个以js验证表单的简洁的注册登录页面,不多说直接上图 效果 主要文件 完整代码 sign_up.html 注册表单 <!DOCTYPE html> <html lang=&qu ...

  5. 一致性哈希算法(consistent hashing)样例+測试。

    一个简单的consistent hashing的样例,非常easy理解. 首先有一个设备类,定义了机器名和ip: public class Cache { public String name; pu ...

  6. Iconfinder 如何杜绝盗版,哈希算法检测图像重复

    原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...

  7. Web存储—简易注册登录

    Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,cookie只 ...

  8. SHA1 安全哈希算法(Secure Hash Algorithm)

    安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signatu ...

  9. SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能

    SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接      SpringBoot注册登录(三):注册 ...

随机推荐

  1. Apache DolphinScheduler 1.2.1 发布说明

    Apache DolphinScheduler 于2020年2月24日正式发布 1.2.1 版,发布内容如下: 新特性: [#1497] 通过 API 创建的工作流在前端展示时自动调整布局. [#74 ...

  2. HttpServletResponse 类

    HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样.每次请求进来,Tomcat 服务器都会创建一个 Respo ...

  3. Python小白自学笔记:英语不好,变量怎么命名

    变量其实很简单,不过在使用过程中会遇到一些棘手的问题. 比如一个变量我之前已经用过了,现在我要定义一个类似的变量,该怎么办? 还有,很多小伙伴其实知道变量应该遵守什么规范,应该代表什么数据,但是大学英 ...

  4. python进阶__用socket封装TCP

    想要理解socket协议,点击链接,出门左转 一.TCP 通信的服务器端编程的基本步骤: 服务器端先创建一个 socket 对象. 服务器端 socket 将自己绑定到指定 IP 地址和端口. 服务器 ...

  5. 第八十八篇:Vue keep-alive的使用 让组件"活下去""

    好家伙, 1.关于keep-alive 这是一个用于阻止组件自行销毁的插件 <!-- keep-alive可以把内部组件进行缓存,而不是销毁组件 --> 那么我们什么时候会用到他呢? 举个 ...

  6. 第七十二篇:Vue组件的props

    好家伙, 1.组件的props props是组件的自定义属性,在封装通用组件的时候,合理的使用props可以极大的提高组件的复用性 来假设一下,如果我们需要两个组件分别显示不同的值 目录结构如下: H ...

  7. gem5 使用记录,对例子中helloobject的理解

    gem5中有一个 hello的例子,不是hello world那个,在src/learning-gem5/part2里面,这是虽然是个简单的例子但包含的要素挺多挺全. 整个结构是src下面有一个hel ...

  8. Python数据科学手册-机器学习: 流形学习

    PCA对非线性的数据集处理效果不太好. 另一种方法 流形学习 manifold learning 是一种无监督评估器,试图将一个低维度流形嵌入到一个高纬度 空间来描述数据集 . 类似 一张纸 (二维) ...

  9. C# 中的那些锁,在内核态都是怎么保证同步的?

    一:背景 1. 讲故事 其实这个问题是前段时间有位朋友咨询我的,由于问题说的比较泛,不便作答,但想想梳理一下还是能回答一些的,这篇就来聊一聊下面这几个锁. Interlocked AutoResetE ...

  10. Redisson多策略注解限流

    限流:使用Redisson的RRateLimiter进行限流 多策略:map+函数式接口优化if判断 自定义注解 /** * aop限流注解 */ @Target({ElementType.METHO ...