一、哈希算法
哈希:
给定明文-计算出一段定长的-不可逆的值
定长输出:不管明文输入多少,哈希都是定长的
不可逆:无法反向计算出对应的明文
雪崩效应:输入改变,输出必然变
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在新网银行的三大场景与五大优化

    在新网银行,每天都有大量的任务实例产生,其中实时任务占据多数.为了更好地处理任务实例,新网银行在综合考虑之后,选择使用 Apache DolphinScheduler 来完成这项挑战.如今,新网银行多 ...

  2. Linux 02 基本命令

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 工具 清屏 cl ...

  3. 通俗理解ABP中的模块Module

    网上有不少文章说ABP的模块,有的直接翻译自官网介绍,有的分析Modlue的源代码,有的写一通代码,没什么注释,很少有能通俗说清的.那么,有两个问题:1.ABP中的模块到底是什么?2.搞这个东西是干嘛 ...

  4. 面试突击75:SpringBoot 有几种读取配置文件的方法?

    Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读 ...

  5. hotspot算法实现 <<深入理解Java虚拟机>>

    1.枚举根节点 解决何时枚举,不需要实时的枚举,oopMap数据结构对象存储枚举信息 对象引用发生变化,需要存储每一条指令到OOPMap吗,,几百M的对象耗时需要很大的内存.GC空间成本 2.安全点: ...

  6. 【NOI P模拟赛】寻找道路(bfs,最短路)

    题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...

  7. [NOI2021] 密码箱 (平衡树,连分数,Stern-Brocot 树,矩阵)

    题面 记忆犹新 题解 f f f 函数值给得非常明显,一看就给人一种熟悉感--这不是连分数吗? 众所周知,连分数有个递推公式,即 p i = a i p i − 1 + p i − 2 q i = a ...

  8. java.lang.UnsatisfiedLinkError报错

    是因为使用maven时,运行web项目时,在maven的依赖包没有打包到tomcat中(out目录中),所以要手动加上

  9. C# winfrom ListView控件实现自由设置每一行字体及背景色等

    背景:公司经常会需要将日志信息,输出到一个对话框中显示出来.之前一直采用的listbox控件,操作简单,使用方便,但是遗憾的是,不能自由控制每一行的状态. 于是想了如下几个方案: (1)重绘listb ...

  10. Android序列化的几种实现方式

    一.Serializable序列化 Serializable是java提供的一种序列化方式,其使用方式非常简单,只需要实现Serializable接口就可以实现序列化. public interfac ...