将普通密码转换为EF Asp.网络身份密码



我有一个项目,我们需要迁移很多用户,他们的纯文本密码到一个新的数据库,我们将散列密码。

新系统使用实体框架,需要使用Asp. js进行认证。网络身份框架。

我发现我可以在c#中生成一个正确的散列密码,实体框架可以毫无问题地读取。

    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到另一个表?

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

如果是因为简单,我会在这个问题上看到类似的东西,是否有PBKDF2的SQL实现?

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

现在有两个轻微的警告确保在事务日志中不会出现纯文本密码。最好是在新数据库结束之前在源数据库中执行散列。否则可能会在初始导入后清除事务日志。如何清除SQL Server事务日志?

你可以使用PasswordHasher代替自己编写哈希方法,这是Asp.net identity默认使用的。它反过来使用Rfc2898DeriveBytes。查看答案https://stackoverflow.com/a/21496255/507279

最新更新