Django身份验证和加密 - 它是如何工作的?

时间:2018-02-09 02:34:18

标签: django django-authentication

我是django的新手,我想知道django中的身份验证系统和哈希密码是如何工作的?为什么不可能知道用户密码? (即使我知道算法和盐)

在我看来,我认为身份验证有点像python条件: 如果输入==密码:  authenticated = True (显然我知道它没有像那样编码)

但我无法弄清楚它是如何散列和散列的,如果有办法知道用户密码是什么?

2 个答案:

答案 0 :(得分:4)

无法识别用户的密码,因为他们已经加密了。

Django使用许多加密安全哈希算法中的任何一个来执行此操作。编写加密哈希算法以获取任意长度的数据并返回似乎完全随机的数字("消息摘要"),但具有几个特殊属性:

  • 输入相同的数据将始终返回相同的数字
  • 输入稍微不同的数据会产生完全不同的数字
  • 几乎不可能从输出数据计算输入数据

你如何编写加密哈希算法来做到这一点很复杂,但如果你感兴趣,还是值得一读。

Django的作用基本上是这样的:

def is_password_correct(hash, salt, rounds, password):
    """<hash>, <salt>, and <rounds> come from the DB
    <password> comes from the user
    """
    digest = hash_function(salt + password)

    # make guessing a password take lots more work
    for n in range(rounds):
        digest = hash_function(digest)

    if digest == hash:
        return True
    else:
        return False

其中hash_function()是Django支持的加密哈希函数之一(例如BCrypt或PBKDF2)。

这比以明文形式在数据库中存储用户密码要安全得多,因为如果黑客要获得数据库的副本,他们将得到的是密码哈希值。从密码哈希中恢复密码需要猜测实际密码并通过运行上述功能进行检查。这可以保护您的用户(与所有安全建议相反)在多个地方使用相同的密码。

您为此安全性支付的价格是每次用户登录&#34;重新加密&#34;时必须运行哈希算法。他们的密码并检查它是否与数据库中的内容匹配(每次登录尝试可能需要几毫秒)。

您可以阅读有关其密码系统here

的更多信息

答案 1 :(得分:0)

密码不是“未散列”,而是以相同的方式再次对密码进行哈希处理,并对哈希值进行比较。