Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django 1.9中创建旧[哈希]密码表_Python_Mysql_Django_Hash - Fatal编程技术网

Python 在Django 1.9中创建旧[哈希]密码表

Python 在Django 1.9中创建旧[哈希]密码表,python,mysql,django,hash,Python,Mysql,Django,Hash,我想做什么: 创建包含2个最近使用的密码(不包括当前密码)的数据库表 到目前为止我发现了什么? 我发现了检查密码('123')功能 据我所知,在运行User.set\u password() 我创建了一个表来存储一个用户名和两个以前使用过的(不包括当前)密码 我发现了两个不同的散列数 User.get\u session\u auth\u hash() 不确定这是否用于密码哈希 用户。设置密码。散列() 同样,不确定这是否用于密码哈希 我的问题: 在我的python sh

我想做什么:

  • 创建包含2个最近使用的密码(不包括当前密码)的数据库表
到目前为止我发现了什么?

  • 我发现了
    检查密码('123')
    功能
    • 据我所知,在运行
      User.set\u password()
  • 我创建了一个表来存储一个用户名和两个以前使用过的(不包括当前)密码
  • 我发现了两个不同的散列数
    • User.get\u session\u auth\u hash()
      • 不确定这是否用于密码哈希
    • 用户。设置密码。散列()
      • 同样,不确定这是否用于密码哈希
我的问题:

在我的python shell(在我的项目下)中,我使用
User.set_password()
并在运行
User.password
后设置相同的当前密码。然后,当我再次运行
User.password
时,会发现有一个不同的散列

如何保存以前的密码散列方法并重新使用它来重新散列密码,以便将其与以前散列的密码进行比较

使用相同密码的密码哈希示例

u = User.objects.get(username='username')  # set user object
u.password  # display current hashed password (password is set to '123')
# pbkdf2_sha256$24000$2lTIbv4a3deG$ElefaaF0aaFh6y50ENNT2pCNQKpoNvYBQ1nZojz8sUg=
u.get_session_auth_hash()
# 8ad1d1d3ac6d442b241f79d447a01ef561960ea4
u.set_password.__hash__()
# -123 (not really, just not sure if safe to post)
u.set_password('123')
# pbkdf2_sha256$24000$VVnXSQdHAak4$FJv3SH/m9jkBcUXAuxJbm0wyhjI+3JHccF7+D2s4qvs=
u.get_session_auth_hash()
# 8416cf2da88c2905862a93464317d779cf938211
u.set_password.__hash__()
# -123 (has not changed after password change)
这只是我在建议的shell中运行命令。我只能想象用散列法进行随机盐析。我觉得这可能有用

我在这一情景中的研究让我想到了这篇文章:

研究更新

我假设在散列中使用了
会话\u auth\u散列。我开始认为在我的数据库中存储这个值可能不安全,但我只能假设它已经存储在某个地方,因为Django需要使用它来散列输入的密码(登录时)以验证它是相同的密码。。。我觉得我只需要分解
set\u password()
函数

最后的想法

是否存在潜在的安全问题


也许可以回答我自己的问题:如果存储salt是一个坏主意,那么存储来自Django的散列密码也是一个坏主意。如果有人访问了我的数据库,他们将能够从数据库中已经存储的散列密码中找到salt。除了将盐分离出来供可能自己动手的攻击者使用之外,我看不出有什么区别。

潜在的突破

打印出散列密码时,这是密码的布局(根据Django网站):
$$

下面是一个哈希示例(纯文本传递为123):

pbkdf2_sha256$24000$tYZnlj3alG8Q$dudmigvgwfjirt2b42/4oeMbNkKA/DVTCFXPte3Yic=

我们可以看到使用的算法是带有sha256散列的pbjdf2(Django 1.9的默认值(我确定是其他版本,但还没有个人确认)。迭代似乎在所有尝试中都很常见(24000,有人能确认吗?),并且salt是可清楚识别的(tYZnlj3alG8Q

如果我从django.contrib.auth导入散列程序导入
,我可以运行
散列程序。生成密码('123',salt='tYZnlj3alG8Q')
,它会打印出相同的散列

from django.contrib.auth import hashers
from django.contrib.auth.models import User
>>> u = User.objects.get(username='test')
>>> print u.password
pbkdf2_sha256$24000$tYZnlj3alG8Q$DuDmimgvgwFjiRT2B42/4oeMbNkKA/DVTCFXPte3Yic=
>>> test = u.password
>>> test1 = hashers.make_password('123', salt='tYZnlj3alG8Q')
>>> print test1
pbkdf2_sha256$24000$tYZnlj3alG8Q$DuDmimgvgwFjiRT2B42/4oeMbNkKA/DVTCFXPte3Yic=
# an extra confirmation
>>> test == test1
True
我计划将我的表格设置为:

ID --- username --- prev1 --- salt1 --- prev2 --- salt2

1  --- test     --- 123   --- ewew@ --- 321   --- saqd!

2  --- test1    --- 456   --- kaka% --- 654   --- ji;l(
测试背后的逻辑类似于

def old_pass_check():
    old_pass_1 = "prev1 pulled from DB"
    salt_1 = "salt1 pulled from DB"
    old_pass_2 = "prev2 pulled from DB
    salt_2 = "salt2 pulled from DB
    new_pass = "entered_pass"

    old_hash_1 = hashers.make_password('new_pass', salt=salt_1)
    old_hash_2 = hashers.make_password('new_pass', salt=salt_2)
    new_hash_1 = hashers.make_password('new_pass', salt=salt_1)
    new_hash_2 = hashers.make_password('new_pass', salt=salt_2)

    if new_hash_1 in {old_hash_1, old_hash_2}:
        return error
    elif new_hash_2 in {old_hash_1, old_hash_2}:
        return error

    else:
        set_password(new_pass)
        *logic to update latest used password and salt into DB table
         making sure only 2 latest passwords are there*