将密码从 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")