前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django 自带密码加密,自定密码加密方式 及自定义验证方式

Django 自带密码加密,自定密码加密方式 及自定义验证方式

作者头像
用户1214487
发布于 2018-01-24 03:15:13
发布于 2018-01-24 03:15:13
4.6K00
代码可运行
举报
文章被收录于专栏:PythonPython
运行总次数:0
代码可运行

在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,今天有需求,需要修改默认加密方式为md5,具体方法为:

在settings.py中加入

代码语言:js
AI代码解释
复制
PASSWORD_HASHERS = (  
 
 'myproject.hashers.MyMD5PasswordHasher',  
 'django.contrib.auth.hashers.MD5PasswordHasher',  
 'django.contrib.auth.hashers.PBKDF2PasswordHasher',  
 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',  
 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',  
 'django.contrib.auth.hashers.BCryptPasswordHasher',  
 'django.contrib.auth.hashers.SHA1PasswordHasher',  
 'django.contrib.auth.hashers.CryptPasswordHasher',  
)  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 PASSWORD_HASHERS = (

     'myproject.hashers.MyMD5PasswordHasher',
     'django.contrib.auth.hashers.MD5PasswordHasher',
     'django.contrib.auth.hashers.PBKDF2PasswordHasher',
     'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
     'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
     'django.contrib.auth.hashers.BCryptPasswordHasher',
     'django.contrib.auth.hashers.SHA1PasswordHasher',
     'django.contrib.auth.hashers.CryptPasswordHasher',
 )

django会默认使用第一条加密方式。

这个是我自定义的加密方式,就是基本的md5,而django的MD5PasswordHasher是加盐的。

以下是我的自定义hashers.py:

代码语言:js
AI代码解释
复制
from django.contrib.auth.hashers import BasePasswordHasher,MD5PasswordHasher  
from django.contrib.auth.hashers import mask_hash  
import hashlib  
 
class MyMD5PasswordHasher(MD5PasswordHasher):  
    algorithm = "mymd5" 
 
 def encode(self, password, salt):  
 assert password is not None 
        hash = hashlib.md5(password).hexdigest().upper()  
 return hash  
 
 def verify(self, password, encoded):  
        encoded_2 = self.encode(password, '')  
 return encoded.upper() == encoded_2.upper()  
 
 def safe_summary(self, encoded):  
 return OrderedDict([  
                (_('algorithm'), algorithm),  
                (_('salt'), ''),  
                (_('hash'), mask_hash(hash)),  
                ])  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  from django.contrib.auth.hashers import BasePasswordHasher,MD5PasswordHasher
  from django.contrib.auth.hashers import mask_hash
  import hashlib
  
  class MyMD5PasswordHasher(MD5PasswordHasher):
      algorithm = "mymd5"
  
      def encode(self, password, salt):
          assert password is not None
          hash = hashlib.md5(password).hexdigest().upper()
          return hash
  
      def verify(self, password, encoded):
          encoded_2 = self.encode(password, '')
          return encoded.upper() == encoded_2.upper()
  
      def safe_summary(self, encoded):
          return OrderedDict([
                  (_('algorithm'), algorithm),
                  (_('salt'), ''),
                  (_('hash'), mask_hash(hash)),
                  ])

之后可以在数据库中看到,密码确实使用了自定义的加密方式。

然而仅仅修改这些,在配合django的authenticate验证时无法进行。

经过一些查找,发现需要在自定义authenticate。以下为方法:

在settings.py中加入以下:

代码语言:js
AI代码解释
复制
AUTHENTICATION_BACKENDS = (  
 'chicken.mybackend.MyBackend',  
)  
AUTHENTICATION_BACKENDS = (
    'chicken.mybackend.MyBackend',
)

以下代码为自定义的mybackend.py

代码语言:js
AI代码解释
复制
import hashlib  
from pro import models  
 
class MyBackend(object):  
 def authenticate(self, username=None, password=None):  
 try:  
            user = models.M_User.objects.get(username=username)  
 print user  
 except Exception:  
 print 'no user' 
 return None 
 if hashlib.md5(password).hexdigest().upper() == user.password:  
 return user  
 return None 
 
 def get_user(self, user_id):  
 try:  
 return models.M_User.objects.get(id=user_id)  
 except Exception:  
 return None 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import hashlib
  from pro import models
  
  class MyBackend(object):
      def authenticate(self, username=None, password=None):
          try:
              user = models.M_User.objects.get(username=username)
              print user
          except Exception:
              print 'no user'
              return None
          if hashlib.md5(password).hexdigest().upper() == user.password:
              return user
          return None
  
      def get_user(self, user_id):
          try:
              return models.M_User.objects.get(id=user_id)
          except Exception:
              return None

之后验证成功。

当然经过这些修改后最终的安全性比起django自带的降低很多,但是需求就是这样的,必须满足。

完成需求的过程中查找了不少资料,最后还是在django文档中找到的答案,文档还是很全全面的,以后通读还是感觉有必要的。

考虑到Django有用户验证模块,证明它已具备跨平台的加密模块。

首先,引入模块:

代码如下

复制代码

>>> from django.contrib.auth.hashers import make_password, check_password 生成密码:   >>> make_password("www.111cn.net", None, 'pbkdf2_sha256') u'pbkdf2_sha256$12000$H6HRZD4DDiKg$RXBGBTiFWADyw+J9O7114vxKvysBVP+lz7oSYxkoic0='

这样就可以利用django自带的模块生成一组密码了,这个函数还有一个特点在于每次生成的密码还不一样:

代码如下

复制代码

>>> make_password("www.111cn.net", None, 'pbkdf2_sha256') u'pbkdf2_sha256$12000$H6HRZD4DDiKg$RXBGBTiFWADyw+J9O7114vxKvysBVP+lz7oSYxkoic0='   >>> make_password("www.111cn.net", None, 'pbkdf2_sha256') u'pbkdf2_sha256$12000$9l09rJd9MbQj$0tJVXBZFN6WwD/qI3WELdrRWOU7Inb7im3uB/np2PPg='   >>> make_password("www.111cn.net", None, 'pbkdf2_sha256') == make_password("www.111cn.net", None, 'pbkdf2_sha256') False

既然每次生成的密文都不一样,如何验证用户提交过来的明文与密文匹配呢?这就靠check_password去做了,check_password使用非常简单,只需要告诉它明文和密文它就会返回False or True验证结果

代码如下

复制代码

>>> text = "www.111cn.net" >>> passwd = make_password(text, None, 'pbkdf2_sha256') >>> print passwd  pbkdf2_sha256$12000$xzMLhCNvQbb8$i1XDnJIpb/cRRGRX2x7Ym74RNfPRCUp5pbU6Sn+V3J0= >>> print check_password(text, passwd) True

如果你不想每次都生成不同的密文,可以把make_password的第二个函数给一个固定的字符串,比如:

代码如下

复制代码

>>> make_password(text, "a", 'pbkdf2_sha256') u'pbkdf2_sha256$12000$a$5HkIPczRZGSTKUBa5uzZmRuAWdp2Qe6Oemhdasvzv4Q=' >>> make_password(text, "a", 'pbkdf2_sha256') u'pbkdf2_sha256$12000$a$5HkIPczRZGSTKUBa5uzZmRuAWdp2Qe6Oemhdasvzv4Q='

只要是任意字符串就可以,并且可以多个。但不能为空,如:

代码如下

复制代码

>>> make_password(text, "", 'pbkdf2_sha256') u'pbkdf2_sha256$12000$KBcG81bWMAvd$aJNgfTOGFhOGogLSTE2goEM3ifKZZ1hydsuFEqnzHXU='   >>> make_password(text, "", 'pbkdf2_sha256') u'pbkdf2_sha256$12000$fNv3YU4kgyLR$1FI8mxArDHt6Hj/eR72YCylGTAkW7YMWTj+wV4VHygY='

为空的字符串就相当于: 1

代码如下

复制代码

make_password(text, None, 'pbkdf2_sha256')

至于make_password第三个参数是表示生成密文的一种方式,根据文档给出的大概有这几种:

代码如下

复制代码

pbkdf2_sha256     pbkdf2_sha1     bcrypt_sha256     bcrypt     sha1     unsalted_md5     crypt

以上例子我使用了第一种加密方式pbkdf2_sha256,crypt和bcrypt都需要另外单独安装模块,unsalted_md5就是常见的md5加密,如果对加密哈希算法不是很了解,那么就使用django最新的哈希算法pbkdf2_sha256就好

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django源码学习-2-Settings.py配置文件-下
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/27
8430
自定义Django的密码策略
Django 从1.4 版本开始,包含了一些安全方面的重要提升。其中一个是使用 PBKDF2 密码加密算法代替了 SHA1 。另外一个特性是你可以添加自己的密码加密方法。 Django 会使用你提供的第一个密码加密方法(在你的 setting.py 文件里要至少有一个方法) 1 2 3 4 5 6 7 8 PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.
happy123.me
2018/06/04
1.7K0
django 1.8 官方文档翻译:13-1-3 密码管理
密码管理在非必要情况下一般不会重新发明,Django致力于提供一套安全、灵活的工具集来管理用户密码。本文档描述Django存储密码和hash存储方法配置的方式,以及使用hash密码的一些实例。
ApacheCN_飞龙
2022/11/27
1.5K0
网站密码存储方案比较
为了对用户负责,用户密码采用不可逆算法的时候,我们就要考虑一下如何对用户密码进行加密。那么仅仅是使用不可逆算法就行了吗?还不是,在硬件飞速发展的今天,尤其是GPU运算能力超CPU 10-20倍甚至更多,使得暴力破解的时间大大缩短。那么为了使得暴力破解变得几乎不可能,我们就要使用一些不支持GPU加速破解的算法。这里所说的算法,实际上也是各种加密的hash方式。
EltonZheng
2021/01/22
1.5K0
密码机制
djeqtdyy-joao-silas 今天主要是介绍的内容是,一般网站,或应用,在用户注册后,用户的密码如何保存在数据库中,当然,肯定不是明文的.只有当事人知道自己的密码,就连后台管理员也不知道,这也就是为什么,你忘记密码后,必须通过其他认证身份后,重新修改密码 数据在网络上传输,要解决以下问题: 机密性 完整性 认证 抗否认性 下面,我用比较直白的话介绍一下上面的具体内容: 机密性: 就是数据在网络上,别人不能直接看到,比如,我发一张裸照,就不会让你直接看到,会加密编码成不能直接查看的内容. 机密性
若与
2018/04/25
1.1K0
密码机制
python-Django 高级特性-Django 安全(一)
Django 是一个重视安全的 Web 框架,它内置了许多安全特性和机制来保护 Web 应用程序免受各种攻击。
玖叁叁
2023/04/24
7170
自定义Django认证系统的技术方案
Django已经提供了开箱即用的认证系统,但是可能并不满足我们的个性化需求。自定义认证系统需要知道哪些地方可以扩展,哪些地方可以替换。本文就来介绍自定义Django认证系统的相关技术细节。
dongfanger
2020/12/16
1.3K0
自定义Django认证系统的技术方案
实战:用户模块,登录注册接口
实战:用户模块,登录注册接口 视图 from django.shortcuts import render from rest_framework.viewsets import ViewSet from rest_framework.decorators import action from django.contrib.auth.hashers import make_password, check_password from rest_framework.response import Respons
HammerZe
2022/05/09
1.1K0
Python实现PBKDF2_SHA256加密密码
加密保存格式:pbkdf2_sha256迭代次数盐哈希值 admin可能的结果:pbkdf2_sha25610000yzsusUJwrGfonw+ZzVxlnA==vgf/OgLf5C4wtQLtfNY9d68H+hxgv8eqZ0mwfxCqqeU=
超级小的大杯柠檬水
2024/12/06
2520
实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postman 需求 注册接口,包含字段用户名,密码,确认密码,用户类型 登陆接口,校验用户名,密码,生成随机字符串 认证功能,除了注册登陆接口外,所有接口都要登陆后访问 频率限制功能,每分钟访问5次,book的所有接口,使用这个频率类 权限限制功能,publish的所有操作需要超级用户能访问,其他的普通登陆用户就
HammerZe
2022/05/09
5220
实战-DRF快速写接口(认证权限频率)
django2.2.6 check_password 验证失败解决办法
python3.6, django 2.2.6 AUTHENTICATION_BACKENDS 里添加自定义认证 CustomBackend(邮箱、手机号等),
KEVINGUO_CN
2020/03/17
9900
『加密算法』| 自动化测试时基于Python常用的几个加密算法实现,你有用到吗?
虫无涯
2023/12/09
4674
常见的加密方式之python实现
编码与解码 通常所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串和Bytes互相转换可以使用encode()和decode()方法。
MIKE笔记
2023/03/23
1.5K0
常见的加密方式之python实现
Python在网络安全与密码学领域的技术实践指南
随着互联网的普及,网络安全和密码学变得愈发重要。Python作为一种强大而灵活的编程语言,为网络安全专业人士提供了丰富的工具和库。本文将介绍如何使用Python进行网络安全与密码学方向的技术实践,包括常见的加密算法、哈希函数、网络安全工具等。
一键难忘
2024/05/12
3090
『Python』hashlib的简单使用
hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
全栈程序员站长
2022/06/27
3620
Django+xadmin打造在线教育平台(三)
代码 github下载 五、用户注册 主要实现功能 用户输入邮箱、密码和验证码,点注册按钮 如果输入的不正确,提示错误信息 如果正确,发送激活邮件,用户通过邮件激活后才能登陆 即使注册功能,没有激活的用户也不能登陆 5.1.初步视图 users/views.py class RegisterView(View): '''用户注册''' def get(self,request): return render(request,'register.html')  用户以g
zhang_derek
2018/04/11
4.4K1
Django+xadmin打造在线教育平台(三)
Spring Security灵活的PasswordEncoder加密方式
本章基于Spring Security 5.4.1版本编写,从5.x版本开始引入了很多新的特性。 为了适配老系统的安全框架升级,Spring Security也是费劲了心思,支持不同的密码加密方式,而且根据不同的用户可以使用不同的加密方式。
恒宇少年
2020/10/29
11.6K0
第一季 | 更新视图扩展类 UpdateModelMixin 修改密码,会用了么
Django REST框架构建Web API。Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2020/04/10
8670
第一季 | 更新视图扩展类 UpdateModelMixin 修改密码,会用了么
如何在Python中实现安全的密码存储与验证
在现代互联网时代,安全性已经成为一个非常重要的问题。在我们的日常生活中,我们会使用许多网站和应用程序,而这些网站和应用程序通常要求我们提供密码来保护我们的个人信息。然而,密码泄露事件时有发生,我们经常听到关于黑客攻击和数据泄露的新闻。那么,如何在Python中实现安全的密码存储与验证呢?本文将向你介绍一些实际的操作和技术。
华科云商小徐
2023/09/27
2.1K0
Django使用自己的用户系统
用过django的人应该都会知道admin,不过,需求是多变的,比如,你有一个变态的用户系统,用户可能有大中小三张头像,除了fisrt name ,last name外还有middle name,T^T name巴拉巴拉,django 的用户系统可能满足不了你的需求,这时候需要用自己的用户系统了,如何能在满足需求的时候充分又利用到django的用户系统?
星哥玩云
2022/06/30
7210
相关推荐
Django源码学习-2-Settings.py配置文件-下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档