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),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有 ...
随机推荐
- 输出python的help结果到文件中
1.命令行方式: python -c "import sys; help(sys.exit)" > help.txt 2.函数代码的方式输出 def help_output( ...
- 〖Linux〗联想K860/i Android 4.2及以上的Bootimg解压与打包工具
因为自己有需要,所以花了一点时间来写了一下. 1. 解压工具 #!/bin/bash - #====================================================== ...
- Python画图matplotlib展示图中中文乱码
在用python的 matplotlib 画图的时候,在图表上面有中文乱码问题,如下的: 解决过程: 平台:windows,python2.7步骤一:打开设置文件 import matplotlib ...
- Linux下PHP5.5编译参数详解
一.配置参数 ./configure --prefix=/data/app/php --with-config-file-path=/etc --with-mysql=/usr\ --with-mys ...
- 【转载】MyEclipse使用指南(精简版)
1.安装 2.注册 3.配置 window ----> preferences (1)配置 JDK java--->Installed JREs --> Add ---> JR ...
- sigmoid 函数与 softmax 函数
sigmoid 函数与 softmax 函数 1. sigmoid 函数 sigmoid 函数又称:logistic函数,逻辑斯谛函数.其几何形状即为一条sigmoid曲线. lo ...
- imageNamed 、imageWithContentsOfFile、 initWithContentsFile区别
[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用 用UIImage加载本地图像最常用的是下面三种: 1.用imageNamed方法 [UIIma ...
- pythonl练习笔记——multiprocessing 多进程拷贝文件
分两份拷贝文件,父进程拷贝文件的前半部分,子进程拷贝文件的后半部分. import os import time #获取文件大小 size = os.path.getsize('wait.py') # ...
- 如何发布打包并发布自己的Android应用(APP)
如何将android项目打包成apk 分类: android 2012-08-29 10:12 1678人阅读 评论(1) 收藏 举报 androideclipseapplicationjdkjava ...
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...