Django 身份验证和密码学 - 它是如何工作的?
Django authentication and cryptography - How does it works?
我是 django 的新手,我想知道身份验证系统和散列密码在 django 中是如何工作的?为什么不可能知道用户密码? (即使我知道算法和盐)
在我看来,我认为身份验证有点像 python 条件:
如果输入==密码:
认证=真
(显然我知道它不是那样编码的)
但我不知道它是如何散列和未散列的,是否有办法知道用户密码是什么?
密码不是 "unhashed",而是再次以相同的方式对密码进行哈希处理并比较哈希值。
不可能知道用户的密码,因为它们是加密的。
Django 使用多种加密安全散列算法中的任何一种来执行此操作。加密哈希算法被编写为获取任意长度的数据和 return 一个数字("message digest"), 似乎 完全随机,但具有几个特殊属性:
- 输入相同的数据总是return相同的数字
- 即使输入稍有不同的数据也会产生完全不同的数字
- 从输出数据计算输入数据几乎是不可能的
您究竟如何编写加密哈希算法来做到这一点很复杂,但如果您有兴趣,值得阅读更多内容。
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)。
这比将用户密码以纯文本形式存储在数据库中要安全得多,因为如果黑客要获取数据库的副本,他们得到的只是密码哈希值。从密码哈希中恢复密码需要猜测实际密码并通过 运行 上述函数进行检查。这可以保护您的用户,他们可能(违反所有安全建议)在多个地方使用相同的密码。
您为此安全性付出的代价是每次用户登录 "re-encrypt" 他们的密码时必须 运行 散列算法并检查它是否与数据库中的内容相匹配(这可能需要每次登录尝试几毫秒)。
您可以阅读更多关于他们的密码系统的信息here
我是 django 的新手,我想知道身份验证系统和散列密码在 django 中是如何工作的?为什么不可能知道用户密码? (即使我知道算法和盐)
在我看来,我认为身份验证有点像 python 条件: 如果输入==密码: 认证=真 (显然我知道它不是那样编码的)
但我不知道它是如何散列和未散列的,是否有办法知道用户密码是什么?
密码不是 "unhashed",而是再次以相同的方式对密码进行哈希处理并比较哈希值。
不可能知道用户的密码,因为它们是加密的。
Django 使用多种加密安全散列算法中的任何一种来执行此操作。加密哈希算法被编写为获取任意长度的数据和 return 一个数字("message digest"), 似乎 完全随机,但具有几个特殊属性:
- 输入相同的数据总是return相同的数字
- 即使输入稍有不同的数据也会产生完全不同的数字
- 从输出数据计算输入数据几乎是不可能的
您究竟如何编写加密哈希算法来做到这一点很复杂,但如果您有兴趣,值得阅读更多内容。
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)。
这比将用户密码以纯文本形式存储在数据库中要安全得多,因为如果黑客要获取数据库的副本,他们得到的只是密码哈希值。从密码哈希中恢复密码需要猜测实际密码并通过 运行 上述函数进行检查。这可以保护您的用户,他们可能(违反所有安全建议)在多个地方使用相同的密码。
您为此安全性付出的代价是每次用户登录 "re-encrypt" 他们的密码时必须 运行 散列算法并检查它是否与数据库中的内容相匹配(这可能需要每次登录尝试几毫秒)。
您可以阅读更多关于他们的密码系统的信息here