【问题标题】:Converting Plain Password to EF Asp.Net Identity PasswordHash将普通密码转换为 EF Asp.Net Identity PasswordHash
【发布时间】:2015-06-04 03:18:33
【问题描述】:

我有一个项目,我们需要将许多具有纯文本密码的用户迁移到一个新数据库中,我们将在其中对密码进行哈希处理。

新系统使用Entity Framework,需要通过Asp.Net Identity框架进行身份验证。

我发现我可以在 C# 中生成一个正确的散列密码,Entity Framework 可以毫无问题地读取。

    public static string HashPassword(string password)
    {
        byte[] salt;
        byte[] buffer2;
        using (var bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
        {
            salt = bytes.Salt;
            buffer2 = bytes.GetBytes(0x20);
        }
        byte[] dst = new byte[0x31];
        Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
        Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
        return Convert.ToBase64String(dst);
    }

SQL 中是否有类似的东西可以在 INSERT 语句中使用,形成对另一个表的 SELECT?

【问题讨论】:

  • @jjj 有趣,让我探索一下这条路,我从未使用过 CLR 集成,但这可能会完成这项工作
  • @jjj 我做了一个测试,它成功了。虽然使用起来很慢,但我认为值得。为了给你一个想法,它从 7 秒到 18 分钟 :)
  • 首先我将纯文本密码迁移到新数据库中,并将它们放入users 表中的TempPassword 列中。然后是一个小型控制台应用程序,它将进入每条记录并从纯文本生成密码哈希并使用哈希更新记录。控制台应用程序可能大约有 30 行。然后验证您可以登录,然后删除TempPassword 列。快速而肮脏,足以进行一次性迁移。
  • 这里有一个很好的答案,关于默认实现如何在 c# 中工作 stackoverflow.com/questions/20621950/… 我最近使用上面和这个 stackoverflow.com/questions/7837547/… 来创建一个解决方案,以在纯 SQL 中生成 hased 密码,可以是在这里找到stackoverflow.com/questions/5033886/…

标签: sql entity-framework sql-server-2012 asp.net-identity


【解决方案1】:

不是内置的,散列是 CPU 密集型的,通常是您希望在 DB 服务器上避免的操作,但我意识到迁移不是正常操作。解决方案取决于您为什么要在 SQL 中运行。

如果是因为简单,我会看类似这个问题Is there a SQL implementation of PBKDF2?

如果是出于性能考虑,我会考虑构建一个小型 .net 迁移器并使用批量插入/更新。例如与 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities 您只能通过选择读取 UserId 和纯文本密码。在 .net 中散列它,然后以可能超过 100k 更新/秒的速度批量更新数据库。

现在有两个轻微的警告 确保您最终不会在交易日志中使用纯文本密码。最好在源数据库结束之前在新数据库中进行散列。否则可以在初始导入后清除事务日志How do you clear the SQL Server transaction log?

您可以使用 Asp.net 身份默认使用的 PasswordHasher,而不是自己编写散列方法。它反过来使用 Rfc2898DeriveBytes。看到这个答案https://stackoverflow.com/a/21496255/507279

【讨论】:

  • 感谢您的回答。我一定会仔细研究你的方法。我想在 SQL 中运行,因为我正在使用 LinkedServer 创建一个巨大的数据库转换。我有这张旧表需要进入一个需要对密码进行哈希处理的新表。这是迄今为止唯一真正需要进行奇怪操作的表。我尽量避免使用太多的 .Net 代码,因为这是一个一次性交易项目。转换完成后,我们将不再需要该项目。
  • 关于 TLOG 的要点。 OP 已经在使用 Rfc2898DeriveBytes,尽管只有 1000 次迭代,其中 isn't sufficient according to OWASP - 现在应该超过 100k。但是请注意,根据设计,这么多的迭代会使散列变慢(100ms #hash),这意味着您需要很长时间才能迁移大量密码。
  • @PatrickDesjardins 即使你想并行化它也需要
  • @StuartLC 是的,这感觉像是将其排除在数据库之外的更多理由。我想您需要将迭代与稍后将在身份中使用的内容同步。
  • 这里的一种常用技术(例如,会员资格重启)是将 #of 哈希、使用的盐和密码哈希存储在一列中。这样就有了一种原子的全有或全无的方法。
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2011-05-30
  • 2019-05-28
  • 1970-01-01
  • 2013-11-26
  • 2013-10-31
相关资源
最近更新 更多