Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否在不重置密码的情况下将ASP.NET成员身份用户迁移到Django?_Asp.net_Django_Hash_Membership_Sha1 - Fatal编程技术网

是否在不重置密码的情况下将ASP.NET成员身份用户迁移到Django?

是否在不重置密码的情况下将ASP.NET成员身份用户迁移到Django?,asp.net,django,hash,membership,sha1,Asp.net,Django,Hash,Membership,Sha1,我有一个部分由别人编写的系统,对于这样一个小应用程序来说,这是一个完全的维护噩梦。我终于得到了改变,这证明我有理由重写这个糟糕的烂摊子,所以我把它搬到了Django 在我尝试之前,我一直试图将密码哈希和salt转移到Django auth表[sha1]$[salt]$[hash]中,但无法正确地进行哈希(重置密码实际上不是一个选项) 以下是到目前为止我能找到的: ASP.NET将哈希存储为base64字符串,并使用base64 salt(哈希之前) 显然,我可以将base64散列反转为字节数组

我有一个部分由别人编写的系统,对于这样一个小应用程序来说,这是一个完全的维护噩梦。我终于得到了改变,这证明我有理由重写这个糟糕的烂摊子,所以我把它搬到了Django

在我尝试之前,我一直试图将密码哈希和salt转移到Django auth表[sha1]$[salt]$[hash]中,但无法正确地进行哈希(重置密码实际上不是一个选项)

以下是到目前为止我能找到的:

  • ASP.NET将哈希存储为base64字符串,并使用base64 salt(哈希之前)
  • 显然,我可以将base64散列反转为字节数组
  • Django使用hexdigest,我尝试了BitConverter.ToString,但它们的散列方式不同
我在这里打一场败仗吗?像ASP.NET那样在Django中编写散列方法会更好吗

感谢您的帮助


<>托马斯

< P>你在这里唯一避免密码重置的真正选项是:

  • 编写哈希转换算法,将Asp.Net哈希转换为hexdigest哈希。祝你好运。如果你成功了,就写一篇论文
  • 重写Django哈希算法,使其哈希与Asp.Net算法相同。这一个应该是最容易完成的,但在这个过程中仍然会有陷阱和陷阱

  • 你也可以尝试对密码进行反向工程,但是如果你成功地做到了这一点,它会使散列算法变得毫无意义。

  • 编写哈希转换算法,将Asp.Net哈希转换为hexdigest哈希。祝你好运。如果你成功了,就写一篇论文
  • 重写Django哈希算法,使其哈希与Asp.Net算法相同。这一个应该是最容易完成的,但在这个过程中仍然会有陷阱和陷阱

  • 您也可以尝试对密码进行反向工程,但如果您成功地做到了这一点,则会使哈希算法在某种程度上变得毫无意义。

    使用以下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)),
                ])
    
    将模块名称添加到密码散列器列表中的设置文件中(有关详细信息,请参阅)

    将ASP.net salt和密码迁移到Django密码字段,如下所示:

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

    然后,用户可以使用现有的ASP.net密码登录到Django应用程序。成功登录后,Django将自动将其密码升级到最新算法,例如PBKDF2。

    使用以下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)),
                ])
    
    将模块名称添加到密码散列器列表中的设置文件中(有关详细信息,请参阅)

    将ASP.net salt和密码迁移到Django密码字段,如下所示:

    user.password = "mssha1$" + old_membership.passwordsalt + "$" + old_membership.password
    
    然后,用户可以使用现有的ASP.net密码登录到Django应用程序。一旦成功登录,Django将自动将其密码升级到最新算法,例如PBKDF2