【问题标题】:Migrating passwords from web2py to Django将密码从 web2py 迁移到 Django
【发布时间】:2015-03-21 05:57:00
【问题描述】:

我使用 SHA 512 算法将密码存储在 web2py 中。我现在正在将模型迁移到 django,因此需要一种使用 SHA 512 在 django 中散列密码的方法,就像 web2py 一样,这样我就可以使用相同的密码对旧用户进行身份验证。请提出一些建议。

【问题讨论】:

    标签: django passwords web2py sha512


    【解决方案1】:

    根据post,一个 Python sn-p 重新创建 web2py 中使用的约定如下:

    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")
    

    【讨论】:

    • 但是每个密码也有盐。我们将如何解决这个问题?
    • 本例中的“盐”是 hmac_key + plain_text_user_password。其中一个由您控制(秘密 hmac_key),另一个由用户提供。这使得 salt 更安全,因为它不会存储在任何地方,因此密码破解将花费更长的时间。
    • 我用有关 web2py salt 的更多信息更新了我的答案
    • 如果你给我来自 web2py 的完整密码哈希 (algo$salt$hash) 以及明文,我可以帮你编写 Python
    • 明文是pawan123和全密码哈希是:SHA512 $ $ b850ed44943b861b c90901439983bce7fd512592b20d83f8e654632dee51de515773e70eabe609f62cebec64fed4df03acd54e6a627c9291e70fdf3a89996ffa796897c159e95c11 跨度>
    【解决方案2】:

    我认为您最好的解决方案是编写一个身份验证后端,该后端将根据 web2py 基础对用户进行身份验证,然后要求他更改或确认他的密码并构建一个新的 Django 身份验证密码。

    加密哈希密码的漏洞在于,如果您有权访问数据库,您或任何黑客都无法看到它们。

    这是writing an authentication backend 上的 Django 文档。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 2014-11-21
      • 2017-02-03
      • 2012-01-01
      • 2018-08-18
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多