2014-09-13 86 views
0

我得到一个旧的php应用程序的用户表,其中用户具有unsalted md5散列作为密码,因为即时将应用程序迁移到django,即时尝试将所有用户放在auth_user表中。python django unsalted md5密码哈希格式

参考this后,可以将密码存储为md5散列而不含盐。但那不适合我? (python/2.7.6,django/1.6.1)

例如,对于密码为“changeme”的用户,我认为它应该是格式md5 $$ 4cb9c8a8048fd02294477fcb1a41191a或者我错过了什么?

编辑:在settings.py Ive得到:在views.py使用login_required装饰

PASSWORD_HASHERS = (
    '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.MD5PasswordHasher', 
    'django.contrib.auth.hashers.CryptPasswordHasher', 
) 

IM如果某种联系:

@login_required 
def index(request): 
    logger.debug('index accessed from %s by %s' % (request.META.get('REMOTE_ADDR'), request.user.username)) 
    member = members.objects.get(nickname=request.user.username) 
    context = {'request': request, 'member': member} 
    return render(request, 'voip/index.html', context) 

及以下urls.py:

url(r'^login/$', 'django.contrib.auth.views.login', { 
    'template_name': 'voip/login.html' 
}), 
url(r'^logout/$', 'django.contrib.auth.views.logout_then_login', { 
    #'template_name': 'voip/logout.html' 
}), 

只要在settings.py中有效,AUTHENTICATION_B ACKENDS看起来像这样:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'django_auth_ldap.backend.LDAPBackend', 
) 

只要我注释掉django_auth_ldap它不工作。但如果我然后将pbkdf2哈希从初始安装的超级用户(用于调试的pive set pw changeme)复制到auth_user表中的我自己的用户,我可以使用密码“changeme”登录...

回答

2

从我在Django 1.6.1源代码中可以看到的不能使用带空盐的MD5PasswordHasher:https://github.com/django/django/blob/1.6.1/django/contrib/auth/hashers.py#L397

但有UnsaltedMD5PasswordHasher这可能适合你。

编辑:你提到的answer是4年前Django 1.2统治市场时写出来的。我检查了它的password hashing code,它没有任何断言,这就是为什么当时MD5 hasher与空盐一起工作的原因。

+0

非常感谢你,解决了我的问题,登录作品! :)太棒了! – vchrizz 2014-09-16 17:05:13

+0

@ChristophLoesch不客气! – 2014-09-16 17:13:11

0

您可以自定义身份验证过程,甚至编写自定义身份验证后端。本主题将正式文件:

https://docs.djangoproject.com/en/1.6/topics/auth/customizing/

+0

嗯,我知道这一点,并想到编写一个自定义的后端,但后来我已阅读并注意到,Django自动更新密码使用新的散列器。所以我只需要知道如何将用户的旧md5哈希存储在'auth_user'表中来写一次,让django完成它的工作。我已经得到了所有其他需要的信息,只是认证失败,我不知道如何正确存储md5哈希。 – vchrizz 2014-09-14 04:05:33

1

我对你的问题的两点建议。

首先,请检查PASSWORD_HASHERSsettings.py。 Django能够从旧算法升级密码,但前提是它们在您的配置中可用。阅读更多at the django docs

至少你需要MD5PasswordHasher激活:

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.PBKDF2PasswordHasher', 
    'django.contrib.auth.hashers.MD5PasswordHasher', 
) 

第二,如果你这样做已经您可以尝试简单地存储旧MD5密码,而不会导致md5$$。这也作为后备支持。 Django会将一个32位十六进制数字识别为MD5哈希。这是从django source code相关代码块:

# Ancient versions of Django created plain MD5 passwords and accepted 
# MD5 passwords with an empty salt. 
if ((len(encoded) == 32 and '$' not in encoded) or 
     (len(encoded) == 37 and encoded.startswith('md5$$'))): 
    algorithm = 'unsalted_md5' 

希望这有助于!

+0

感谢您指出了这一点,尝试使用和不使用'md5 $$',但不起作用。我用我的password_hashers设置编辑了我的帖子。因为我没有在网上找到关于这样一个问题的很多信息,所以我想我的问题更多的是它的一些问题,但是我可以在哪里找到可以解决问题的地方?因为我没有看到任何错误或类似,只是不能验证... – vchrizz 2014-09-15 23:42:55