这是一个我已经有了一个可以接受的答案-所以我在这里张贴,看看是否有人可以改善它。在
我正在从一个旧的定制系统(mysql数据库和明文密码)迁移客户数据去django。数据迁移只需要使用一组sql脚本来完成,这些脚本可以在两个数据库上运行(将数据从旧数据库移动到新数据库并将其转换)。这个过程需要是可重复的、可预测的,并且有可能在无人值守的情况下运行。在
我需要获取现有的密码,加密并以Django可以接受的格式存储它们(参见详细信息here)。理想情况下,我会使用django首选的PBKDF2哈希器来实现这一点,但这很困难,因为我无法轻松模拟PBKDF2所做的密码拉伸/多次迭代。在
我现在的解决方法是使用SHA1对明文密码进行加密和加密,并将它们存储在Django中。然后,在客户第一次登录时,Django自动将密码加密升级到PBKDF2。在
我想使用SHA2/SHA256来实现这一点,但是Django在没有PBKDF2的情况下不支持它,至少除非我编写自己的密码哈希后端并将其添加到Django中设置.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;
输出如下密码字符串:
^{pr2}$
到目前为止,它是一种享受-用户可以登录,加密是无声的升级。唯一的缺点是我们使用相对不安全的SHA1算法,至少在用户登录一次之前。在
有人能改进这个解决方案吗?在