2015-06-04 2 views
5

У меня есть проект, в котором нам нужно перенести много пользователей, у которых есть свой пароль в виде простого текста, в новую базу данных, где мы будем вводить пароль.Преобразование простого пароля в EF Asp.Net Identity PasswordHash

В новой системе используется Entity Framework, и ее необходимо аутентифицировать с помощью инфраструктуры Identity Asp.Net.

Я обнаружил, что могу сгенерировать на 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 заявление образуют ВЫБРАТЬ к другой таблице?

+2

Не хотите использовать [SQL Server CLR integration] (https://msdn.microsoft.com/en-us/library/w2kae45k (v = vs.90) .aspx)? – jjj

+0

@jjj Интересно, позвольте мне изучить этот путь, я никогда не использовал интеграцию CLR, но это могло бы сделать работу –

+0

@jjj Я сделал тест, и он сработал. Это довольно медленно использовать, но, я думаю, это того стоит. Чтобы дать вам идею, она проходит от 7 секунд до 18 минут :) –

ответ

3

Не встроенный, хеширование интенсивное и обычно операция, которую вы хотите избежать на сервере БД, я понимаю, что миграция не является нормальной работой. Решение немного зависит от того, почему вы хотите запускать SQL.

Если это из-за простоты я хотел бы посмотреть на то, как в этом вопросе Is there a SQL implementation of PBKDF2?

Если это из-за выступления я хотел бы рассмотреть только строить небольшой .net Migrator и использовать насыпной вставив/обновления. Например, с помощью https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities вы можете прочитать только UserId и пароль обычного текста с выбранным. Хешируйте его в .net, а затем обновите базу данных на один объем, возможно, более 100 000 обновлений/секунду.

Теперь два незначительных предупреждения Убедитесь, что вы не используете текстовые пароли в журнале транзакций. Предположим, сделав хеширование в исходной базе данных до того, как она окажется в новой. В противном случае можно очистить журнал транзакций после первоначального импорта How do you clear the SQL Server transaction log?

Вместо того, чтобы самостоятельно писать метод хэширования, вы можете использовать PasswordHasher, который по умолчанию используется идентификатором Asp.net. Он, в свою очередь, использует Rfc2898DeriveBytes. См. Этот ответ https://stackoverflow.com/a/21496255/507279

+0

Благодарим вас за ответ. Я определенно буду более внимательно смотреть на ваш подход. Я хочу работать в SQL, потому что я создаю огромное преобразование БД с помощью LinkedServer. У меня есть эта старая таблица, которая должна войти в новую, для которой требуется пароль для хэширования. Это единственная таблица, которая действительно требует странных манипуляций. Я стараюсь избегать иметь слишком много кода .Net, потому что это проект с 1 раз. Как только конверсия будет завершена, нам больше не понадобится проект. –

+0

Хороший вопрос о TLOG. OP уже использует [Rfc2898DeriveBytes] (https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396), хотя всего за 1000 итераций, которые [недостаточно в соответствии с OWASP] (http://stackoverflow.com/a/14263775/314291) - к настоящему времени это должно быть более 100 тыс. Однако обратите внимание, что по дизайну эти многочисленные итерации замедляют хеширование (100 мс #hash), что означает, что вам потребуется довольно много времени для переноса большого количества паролей. – StuartLC

+0

@PatrickDesjardins. Требуется <50 LOC C#, даже если вы хотите параллелизировать его (см. Комментарий Stuarts). Вы выполняете «горячую» миграцию или будете ли вы отключать ее во время миграции? Если вы делаете горячую миграцию. Возможно, вам все равно придется готовить хеши. –

Смежные вопросы