【问题标题】:Generating encrypted passwords in mysql, to populate a django database在 mysql 中生成加密密码,以填充 django 数据库
【发布时间】:2014-12-17 18:34:45
【问题描述】:

这个问题我已经有了一个可以接受的答案 - 所以我在这里发帖看看是否有人可以改进它。

我正在将客户数据从旧的定制系统(带有明文密码的 mysql 数据库!!)迁移到 django。数据迁移将仅使用一组 sql 脚本来完成,这些脚本可以针对两个数据库运行(将数据从旧数据库移动和转换到新数据库)。该过程需要是可重复的、可预测的,并且可能能够在无人值守的情况下运行。

我需要获取现有密码,加密并以 Django 可接受的格式存储它们(详情请参阅 here)。理想情况下,我会使用 django 首选的 PBKDF2 哈希器来执行此操作,但这很难,因为我无法轻松模拟 PBKDF2 所做的密码拉伸/多次迭代。

我现在的解决方法是使用 SHA1 对明文密码进行加盐和加密,并将它们存储在 Django 中。然后,客户第一次登录,Django自动将密码加密升级为PBKDF2。

我想为此使用 SHA2/SHA256,但如果没有 PBKDF2,Django 不支持,至少不支持,除非我编写自己的密码哈希后端并将其添加到 django settings.py 中——这似乎需要付出很多努力.

因此,我在迁移 sql 脚本中得到了以下内容(为清楚起见进行了简化):

insert into auth_user(username,password)

SELECT username
    , CONCAT(
    'sha1$',
    @salt := SUBSTRING(MD5(RAND()) FROM 1 FOR 12),
    '$', SHA1(CONCAT(@salt,password))
    )  AS password
FROM
    old_user_table;

输出密码字符串如下:

sha1$a6acb1163c50$e7225b82280d66b4d8125cb7817b7854e98a5657

到目前为止,它是一种享受 - 用户可以登录并且加密被静默升级。唯一的缺点是我们使用的是相对不安全的 SHA1 算法,至少在用户登录一次之前是这样。

谁能改进这个解决方案?

【问题讨论】:

    标签: python mysql sql django encryption


    【解决方案1】:

    您拥有明文密码,因此您可以编写一个简单的脚本来遍历您的所有用户并对其进行身份验证。在迁移 sql 脚本之后运行此命令,这将在您将每个用户的密码公开给真实用户之前升级每个用户的密码,从而减轻您对安全性降低的担忧。

    from django.contrib.auth import authenticate
    
    for username, password in get_usernames_and_passwords():
        if authenticate(username=username, password=password) is None:
            print "Failed to authenticate user {!r}".format(username)
    

    【讨论】:

    • 这是个好主意,虽然它不符合我的要求,即所有事情都可以通过一组 sql 脚本一次完成。还是谢谢!
    • 我不知道你的环境,也不是限制的原因,但是,必须调用 mysql 来运行 sql 迁移脚本......这可能是运行代码的 Python 脚本类似于上面的迁移后。
    • 没有限制,我只是不想在django项目中添加代码和处理部署等。现在迁移过程是纯sql,因此很容易独立于dev运行团队。我只是从我最喜欢的 mysql GUI (SQlyog) 中运行它。您的解决方案仍然是一个很好的解决方案,它只是不太适合我想做的事情。但我可能仍然会实现它!
    猜你喜欢
    • 2011-08-09
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多