【发布时间】: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