Pat*_*ins 6 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);
}
Run Code Online (Sandbox Code Playgroud)
SQL中是否有类似的东西我可以在INSERT语句中使用SELECT到另一个表?
不是内置的,散列是 CPU 密集型的,通常是您希望在数据库服务器上避免的操作,但我意识到迁移不是正常的操作。该解决方案在一定程度上取决于您为什么要在 SQL 中运行。
如果是因为简单,我会看看这个问题Is there a SQLimplementation of PBKDF2?类似的内容。
如果是因为性能问题,我会考虑构建一个小型 .net 迁移器并使用批量插入/更新。例如,使用 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities,您可以通过选择仅读取 UserId 和纯文本密码。将其散列到 .net 中,然后以每秒可能超过 100k 更新的速度批量更新数据库。
现在有两个小警告 确保事务日志中不会出现纯文本密码。最好在源数据库最终进入新数据库之前对其进行哈希处理。否则,可以在初始导入后清除事务日志如何清除 SQL Server 事务日志?
您可以使用 PasswordHasher,而不是自己编写哈希方法,这是 Asp.net 身份默认使用的方法。它又使用 Rfc2898DeriveBytes。请参阅此答案/sf/answers/1504737881/
归档时间: |
|
查看次数: |
2233 次 |
最近记录: |