是否在不重置密码的情况下将ASP.NET成员身份用户迁移到Django?
我有一个部分由别人编写的系统,对于这样一个小应用程序来说,这是一个完全的维护噩梦。我终于得到了改变,这证明我有理由重写这个糟糕的烂摊子,所以我把它搬到了Django 在我尝试之前,我一直试图将密码哈希和salt转移到Django auth表[sha1]$[salt]$[hash]中,但无法正确地进行哈希(重置密码实际上不是一个选项) 以下是到目前为止我能找到的:是否在不重置密码的情况下将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散列反转为字节数组
- ASP.NET将哈希存储为base64字符串,并使用base64 salt(哈希之前)
- 显然,我可以将base64散列反转为字节数组
- Django使用hexdigest,我尝试了BitConverter.ToString,但它们的散列方式不同
<>托马斯< P>你在这里唯一避免密码重置的真正选项是:
你也可以尝试对密码进行反向工程,但是如果你成功地做到了这一点,它会使散列算法变得毫无意义。
您也可以尝试对密码进行反向工程,但如果您成功地做到了这一点,则会使哈希算法在某种程度上变得毫无意义。使用以下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