将密码从 web2py 迁移到 Django
Migrating passwords from web2py to Django
我使用 SHA 512 算法将密码存储在 web2py 中。我现在正在将模型迁移到 django,因此需要一种使用 SHA 512 在 django 中散列密码的方法,就像 web2py 所做的那样,这样我就可以使用相同的方法对旧用户进行身份验证 passwords.Please suggest some way.
我认为你最好的解决方案是编写一个身份验证后端,它将根据 web2py 库对用户进行身份验证,然后要求他更改或确认他的密码并构建一个新的 Django 身份验证密码。
加密散列密码的漏洞在于,如果您有权访问数据库,您或任何黑客都看不到它们。
这是关于 writing an authentication backend 的 Django 文档。
根据此 post 重新创建 web2py 中使用的约定的 Python 片段如下:
from hashlib import md5
import hmac
hmac_key = '<your secret key>'
password = 'insecure'
thehash = hmac.new(hmac_key, password).hexdigest()
print thehash
web2py 使用 hmac(这是您的秘密 + 用户密码的明文)作为最终哈希,而不仅仅是直接的 MD5/SHA 哈希(取决于您的设置)。因此,您只需要在上面的示例中将 MD5 换成 SHA 即可让您的工作正常进行。但是这个实现是您需要在新应用程序中实现的所有实现,只要密钥相同就可以使它们交叉兼容。
根据 docs 散列以下列格式存储:
<algorithm>$<salt>$<hash>
因此,如果使用了盐,那么它会与哈希一起存储,以便轻松获取盐以用于您的新应用程序。美元符号使解析每个值变得容易。
algo, salt, hash = password_hash.split("$")
更新:我从 web2py 源代码中提取了以下代码,但您需要做的是使用您为 auth.settings.hmac_key 设置的值更新变量 hmac_key。希望当你 运行 (在你更新 hmac_key 变量之后)这个哈希值应该匹配。
import hashlib
import hmac
from hashlib import sha512
h="sha512$b850ed44943b861b$c90901439983bce7fd512592b20d83f8e654632dee51de515773e70eabe609f62cebec64fed4df03acd54e6a627c9291e70fdf3a89996ffa796897c159e95c11"
algo,salt,hash = h.split("$")
print "crypted hash: %s"%hash
pwd = "pawan123"
##get this value from auth.settings.hmac_key
hmac_key = ""
def get_digest(value):
"""
Returns a hashlib digest algorithm from a string
"""
if not isinstance(value, str):
return value
value = value.lower()
if value == "md5":
return md5
elif value == "sha1":
return sha1
elif value == "sha224":
return sha224
elif value == "sha256":
return sha256
elif value == "sha384":
return sha384
elif value == "sha512":
return sha512
else:
raise ValueError("Invalid digest algorithm: %s" % value)
#hashed = simple_hash(self.password, key, salt, digest_alg)
def simple_hash(text, key='', salt='', digest_alg='md5'):
"""
Generates hash with the given text using the specified
digest hashing algorithm
"""
if not digest_alg:
raise RuntimeError("simple_hash with digest_alg=None")
elif not isinstance(digest_alg, str): # manual approach
h = digest_alg(text + key + salt)
elif digest_alg.startswith('pbkdf2'): # latest and coolest!
iterations, keylen, alg = digest_alg[7:-1].split(',')
return pbkdf2_hex(text, salt, int(iterations),
int(keylen), get_digest(alg))
elif key: # use hmac
digest_alg = get_digest(digest_alg)
h = hmac.new(key + salt, text, digest_alg)
else: # compatible with third party systems
h = get_digest(digest_alg)()
h.update(text + salt)
return h.hexdigest()
print "result hash: %s"%simple_hash(pwd, hmac_key, salt, "sha512")
我使用 SHA 512 算法将密码存储在 web2py 中。我现在正在将模型迁移到 django,因此需要一种使用 SHA 512 在 django 中散列密码的方法,就像 web2py 所做的那样,这样我就可以使用相同的方法对旧用户进行身份验证 passwords.Please suggest some way.
我认为你最好的解决方案是编写一个身份验证后端,它将根据 web2py 库对用户进行身份验证,然后要求他更改或确认他的密码并构建一个新的 Django 身份验证密码。
加密散列密码的漏洞在于,如果您有权访问数据库,您或任何黑客都看不到它们。
这是关于 writing an authentication backend 的 Django 文档。
根据此 post 重新创建 web2py 中使用的约定的 Python 片段如下:
from hashlib import md5
import hmac
hmac_key = '<your secret key>'
password = 'insecure'
thehash = hmac.new(hmac_key, password).hexdigest()
print thehash
web2py 使用 hmac(这是您的秘密 + 用户密码的明文)作为最终哈希,而不仅仅是直接的 MD5/SHA 哈希(取决于您的设置)。因此,您只需要在上面的示例中将 MD5 换成 SHA 即可让您的工作正常进行。但是这个实现是您需要在新应用程序中实现的所有实现,只要密钥相同就可以使它们交叉兼容。
根据 docs 散列以下列格式存储:
<algorithm>$<salt>$<hash>
因此,如果使用了盐,那么它会与哈希一起存储,以便轻松获取盐以用于您的新应用程序。美元符号使解析每个值变得容易。
algo, salt, hash = password_hash.split("$")
更新:我从 web2py 源代码中提取了以下代码,但您需要做的是使用您为 auth.settings.hmac_key 设置的值更新变量 hmac_key。希望当你 运行 (在你更新 hmac_key 变量之后)这个哈希值应该匹配。
import hashlib
import hmac
from hashlib import sha512
h="sha512$b850ed44943b861b$c90901439983bce7fd512592b20d83f8e654632dee51de515773e70eabe609f62cebec64fed4df03acd54e6a627c9291e70fdf3a89996ffa796897c159e95c11"
algo,salt,hash = h.split("$")
print "crypted hash: %s"%hash
pwd = "pawan123"
##get this value from auth.settings.hmac_key
hmac_key = ""
def get_digest(value):
"""
Returns a hashlib digest algorithm from a string
"""
if not isinstance(value, str):
return value
value = value.lower()
if value == "md5":
return md5
elif value == "sha1":
return sha1
elif value == "sha224":
return sha224
elif value == "sha256":
return sha256
elif value == "sha384":
return sha384
elif value == "sha512":
return sha512
else:
raise ValueError("Invalid digest algorithm: %s" % value)
#hashed = simple_hash(self.password, key, salt, digest_alg)
def simple_hash(text, key='', salt='', digest_alg='md5'):
"""
Generates hash with the given text using the specified
digest hashing algorithm
"""
if not digest_alg:
raise RuntimeError("simple_hash with digest_alg=None")
elif not isinstance(digest_alg, str): # manual approach
h = digest_alg(text + key + salt)
elif digest_alg.startswith('pbkdf2'): # latest and coolest!
iterations, keylen, alg = digest_alg[7:-1].split(',')
return pbkdf2_hex(text, salt, int(iterations),
int(keylen), get_digest(alg))
elif key: # use hmac
digest_alg = get_digest(digest_alg)
h = hmac.new(key + salt, text, digest_alg)
else: # compatible with third party systems
h = get_digest(digest_alg)()
h.update(text + salt)
return h.hexdigest()
print "result hash: %s"%simple_hash(pwd, hmac_key, salt, "sha512")