2010-10-25 102 views
3

我有这个更改密码请求表单。其中用户输入他们的旧密码。Python md5密码值

这个oldpassword是md5格式。

如何的MD5值从数据库中比较受用户输入的旧密码

import md5 

oldpasswd_byuser=str("tom") 
oldpasswd_db="sha1$c60da$1835a9c3ccb1cc436ccaa577679b5d0321234c6f" 
opw=  md5.new(oldpasswd_byuser) 
#opw=  md5.new(oldpasswd_byuser).hexdigest() 
if(opw ==  oldpasswd_db): 
    print "same password" 
else: 
    print "Invalid password" 

回答

3

你把散在有一种咸鱼SHA1 hexdigest为Django的(也可能是许多人)并将其存储在默认情况下。

验证它的代码是contrib/auth/models.py。从那里你可以看到django默认使用md5。所有你所要做的就是更新旧哈希以下形式:

md5$<salt>$<hash> 

如果你的哈希值不咸又离开盐空(md5$$<hash>),但更新哈希值到下一次SHA1用户执行有效的登录。

+0

难道你给一个相关的例子的字符串汤姆转换成MD5按照乌尔交代 – Rajeev 2010-10-25 07:57:43

+0

腌制(HTTP ://en.wikipedia.org/wiki/Salt_%28cryptography%29)完成密码以防止对您的数据库进行字典攻击。我会按照有关登录信号的问题(http://stackoverflow.com/questions/1990502/django-signal-when-user-logs-in)中所述包装登录视图并更新包装视图中的哈希。所以你不要自己乱写字符串''torn'',但是如果user.is_authenticated()和user.password.startswith('md5 $)从登录视图包装器中调用user.set_password('torn')' $“)'。 – tback 2010-10-25 09:13:25

+1

现在,Django自动升级旧密码。 – 2012-05-30 09:13:52

2

我不认为oldpasswd_db是一个MD5。它看起来更像是散列方法(本例中为SHA1),盐和密码散列本身的组合。

尝试与密码串连盐值:

import hashlib 
hashlib.sha1('c60datom').hexdigest() 
0

比较当前密码存储在数据库中的密码的值,你可以这样做:

import md5 

input_password = request.POST['password'] 
md5_hashed_input_password = md5.new(input_password).hexdigest() 
#comapre the value to that stored in db 
if md5_hashed_input_password == db_password: #password in db should be stored in md5 hash format 
    print 'password match' 
else: 
    print 'password mismatch'