将普通密码转换为EF Asp.Net Identity PasswordHash

时间:2015-06-04 03:18:33

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

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

新系统使用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到另一个表?

1 个答案:

答案 0 :(得分:3)

没有内置,散列是cpu密集型的,通常是你想要在数据库服务器上避免的操作,我意识到迁移不是正常的操作。解决方案有点依赖于您希望在SQL中运行的原因。

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

如果是因为性能,我会考虑构建一个小的.net迁移器并使用批量插入/更新。例如用 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities您只能使用select读取UserId和纯文本密码。在.net中哈希,然后在一个批量中更新数据库,可能超过100k更新/秒。

现在有两个轻微的警告 确保在事务日志中不使用纯文本密码。优选地,通过在源数据库中进行散列之前在新数据库中进行散列。否则,可以在初始导入How do you clear the SQL Server transaction log?

之后清除事务日志

您可以使用PasswordHasher而不是自己编写散列方法,这是Asp.net标识默认使用的。它反过来使用Rfc2898DeriveBytes。请参阅此回答https://stackoverflow.com/a/21496255/507279