Django 自带密码加密,自定密码加密方式 及自定义验证方式
在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,今天有需求,需要修改默认加密方式为md5,具体方法为:
在settings.py中加入
- 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',
- )
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:
- 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)),
- ])
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中加入以下:
- AUTHENTICATION_BACKENDS = (
- 'chicken.mybackend.MyBackend',
- )
AUTHENTICATION_BACKENDS = (
'chicken.mybackend.MyBackend',
)
以下代码为自定义的mybackend.py
- 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
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 生成密码: |
|
这样就可以利用django自带的模块生成一组密码了,这个函数还有一个特点在于每次生成的密码还不一样:
| 代码如下 | 复制代码 |
|
>>> make_password("www.111cn.net", None, 'pbkdf2_sha256') |
|
既然每次生成的密文都不一样,如何验证用户提交过来的明文与密文匹配呢?这就靠check_password去做了,check_password使用非常简单,只需要告诉它明文和密文它就会返回False or True验证结果
| 代码如下 | 复制代码 |
|
>>> text = "www.111cn.net" |
|
如果你不想每次都生成不同的密文,可以把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') |
|
为空的字符串就相当于:
1
| 代码如下 | 复制代码 |
|
make_password(text, None, 'pbkdf2_sha256') |
|
至于make_password第三个参数是表示生成密文的一种方式,根据文档给出的大概有这几种:
| 代码如下 | 复制代码 |
|
pbkdf2_sha256 |
|
以上例子我使用了第一种加密方式pbkdf2_sha256,crypt和bcrypt都需要另外单独安装模块,unsalted_md5就是常见的md5加密,如果对加密哈希算法不是很了解,那么就使用django最新的哈希算法pbkdf2_sha256就好
Django 自带密码加密,自定密码加密方式 及自定义验证方式的更多相关文章
- django 自定义 密码加密方式 及自定义验证方式
在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,但如果需要修改默认加密方式为md5,具体方法为: 在settings.p ...
- django自带加密模块的使用
首先,引入模块: 代码如下 复制代码 >>> from django.contrib.auth.hashers import make_password, check_passwo ...
- 电信级的RSA加密后的密码的破解方法
一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...
- 使用BCrypt算法加密存储登录密码用法及好处
//导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...
- 强力重置ASP.NET membership加密后的密码![转]
公司网站的用户管理采用的是ASP.NET内置的membership管理,在web.config文件中的密码格式配置是加密了的,passwordFormat="Hashed",这样在 ...
- Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作
# -*- coding: gb2312 -*- #用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作 #作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.co ...
- Zip伪加密 破解ZIP密码
ZIP是一种相当简单的分别压缩每个文件的存档格式.分别压缩文件允许不必读取另外的数据而检索独立的文件:理论上,这种格式允许对不同的文件使用不同的算法.不管用何种方法,对这种格式的一个告诫是对于包含很多 ...
- MD5加密 及获得密码盐
MD5加密 及获得密码盐 using System; using System.Collections.Generic; using System.Configuration; using Syste ...
- 数据加密实战之记住密码、自动登录和加密保存数据运用DES和MD5混合使用
MD5的简介:MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有 ...
随机推荐
- How to Analyze Java Thread Dumps
When there is an obstacle, or when a Java based Web application is running much slower than expected ...
- sass / scss
Sass 有两种语法规则(syntaxes),目前新的语法规则(从 Sass 3开始)被称为 “SCSS”( 时髦的css(Sassy CSS)),它是css3语法的的拓展级,就是说每一个语法正确的C ...
- 【JS】怎样同一时候处理多个window.onload事件
有时引用其他js时,其js却使用了window.onload事件,这种话,引入的页面的onload事件就有可能执行不了.如何才干两个都执行呢?除了将两个写到一块儿去的方法外,还有其他的方法 if(wi ...
- List(T)类的方法
List<T>.Clear 方法 List<T>.RemoveAll 方法 http://msdn.microsoft.com/zh-cn/library/s6hkc2c4(v ...
- oracle 批量更新之update case when then
oracle 批量更新之update case when then CreationTime--2018年8月7日15点51分 Author:Marydon 1.情景描述 根据表中同一字段不同情况 ...
- Oracle PUP(PRODUCT_USER_PROFILE)配置和使用
近期在翻Oracle SQLPLUS官方文档,在讲SQLPLUS Security章节介绍了PUP这个机制.借此.我来使用下面: PUP(PRODUCT_USER_PROFILE)介绍 PRODU ...
- mybatis实现多表联合查询
本文转自:http://www.cnblogs.com/xdp-gacl/p/4264440.html#!comments 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) ...
- 【LeetCode】35. Search Insert Position (2 solutions)
Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...
- SQL语句面试题
一条SQL查询,一个表中按日期的累加数据如表: tmp_pay_amount pay_time amount 2013-11-1 10 2013-11-2 5 2013-11-3 4 2013-11- ...
- vi/vim 查找替换使用方法
http://wzgyantai.blogbus.com/logs/28117977.html vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记 ...