Миграция пользователей членства ASP.NET в Django без сброса паролей? - PullRequest
1 голос
/ 27 января 2011

У меня есть система, которая была частично написана кем-то другим, и это полный кошмар обслуживания для такого маленького приложения. Мне наконец-то дали изменения, которые оправдывают переписывание ужасного беспорядка, поэтому я перенес его в Джанго.

Прежде чем сделать решающий шаг, я пытался перебрать хэш и соль пароля в таблицах аутентификации Django [sha1] $ [salt] $ [hash], но не могу правильно перевести его в хэш (сброс паролей на самом деле не вариант).

Вот что мне удалось узнать:

  • ASP.NET сохраняет хеш как строку base64 и использует соль base64 (до хеша)
  • Я, очевидно, могу обратить хеш base64 в байтовый массив
  • Django использует hexdigest, я пробовал BitConverter.ToString, но они хэшируют по-разному

Я веду здесь проигранную битву? Было бы лучше написать метод в Django для хеширования, как это делает ASP.NET?

Любая помощь приветствуется,

Thomas

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Единственные реальные варианты, которые вы можете здесь использовать, чтобы избежать сброса пароля в середине:

  1. Напишите алгоритм преобразования хеша для переноса хеша Asp.Net в хеш hexdigest.Удачи с этим.Если вы это сделаете, напишите об этом статью.
  2. Перепишите алгоритм хеширования Django, чтобы он идентично хэш-алгоритму Asp.Net.Это должно быть проще всего, но в нем все еще будут свои ловушки и ловушки.

Вы также можете попытаться перепроектировать пароли, но если у вас все получитсяэто делает бессмысленный алгоритм хеширования IMO.

2 голосов
/ 27 января 2014

Создайте новый модуль со следующим хешем паролей Django для обработки паролей ASP.net (sha1):

import hashlib
import base64

from django.contrib.auth.hashers import (BasePasswordHasher, mask_hash)
from django.utils.datastructures import SortedDict
from django.utils.encoding import force_bytes
from django.utils.crypto import constant_time_compare
from django.utils.translation import ugettext_noop as _

def utf16tobin(s):
    return s.encode('hex')[4:].decode('hex')

class MSSHA1PasswordHasher(BasePasswordHasher):
    """
    ASP.NET hasher
    """
    algorithm = "mssha1"

    def encode(self, password, salt):
        assert password is not None
        assert salt and '$' not in salt
        pwdenc = password.encode('utf16')
        pwdenc = utf16tobin(pwdenc)
        saltdecode = base64.b64decode(salt)
        m = hashlib.sha1()
        m.update(saltdecode)
        m.update(pwdenc)
        hash = base64.b64encode(m.digest())
        return "%s$%s$%s" % (self.algorithm, salt, hash)

    def verify(self, password, encoded):
        algorithm, salt, hash = encoded.split('$', 2)
        assert algorithm == self.algorithm
        encoded_2 = self.encode(password, salt)
        return constant_time_compare(encoded, encoded_2)

    def safe_summary(self, encoded):
        algorithm, salt, hash = encoded.split('$', 2)
        assert algorithm == self.algorithm
        return SortedDict([
            (_('algorithm'), algorithm),
            (_('salt'), mask_hash(salt, show=2)),
            (_('hash'), mask_hash(hash)),
            ])

Добавьте имя модуля в файл настроек в списке PASSWORD_HASHERS (см. https://docs.djangoproject.com/en/1.4/topics/auth/ для получения подробной информации).

Перенесите соль и пароль ASP.net в поле пароля Django следующим образом:

user.password = "mssha1$" + old_membership.passwordsalt + "$" + old_membership.password

Пользователи могут затем войти в приложение Django со своим существующим ASP.сетевые пароли.После успешного входа в систему Django автоматически обновит свои пароли до последнего алгоритма, например, PBKDF2.

...