Изменение формата пароля с Зашифрованного на Хешированный - PullRequest
14 голосов
/ 09 февраля 2011

Я нахожу на удивление мало информации о преобразовании существующей базы данных из зашифрованных паролей в хешированные пароли.(Мне удалось найти немного больше информации о конвертации, но это не сильно помогло.)

Как известно большинству людей, изменение настройки passwordFormat в web.config влияет только на новыепользователи.У меня есть база данных с несколькими сотнями пользователей, и я хотел бы преобразовать их в хешированные пароли без изменения этих существующих паролей.

Кто-нибудь еще знаком с тем, как к этому можно подойти?Спасибо за любые советы.

Ответы [ 4 ]

14 голосов
/ 15 марта 2012

Решение Грега - хорошее начало, но оно не повлияет на существующих пользователей.SqlMembershipProvider защищает существующих пользователей и пароли, сохраняя PasswordFormat (0 = очистить, 1 = хешированный, 2 = зашифрованный) в таблице вместе с паролями.Изменение формата пароля поставщика влияет только на вставки в пользовательские таблицы.Чтобы преобразовать пароли существующих пользователей в хэшированные, необходимо изменить параметр PasswordFormat для каждой записи.Вот простой способ сделать это:

void HashAllPasswords()
{
    var clearProvider = Membership.Providers["SqlProvider_Clear"];
    var hashedProvider = Membership.Providers["SqlProvider_Hashed"];
    int dontCare;
    if (clearProvider == null || hashedProvider == null) return;
    var passwords = clearProvider.GetAllUsers(0, int.MaxValue, out dontCare)
        .Cast<MembershipUser>().ToDictionary(u => u.UserName, u => u.GetPassword());

    using (var conn = new SqlConnection(
           ConfigurationManager.ConnectionStrings[0].ConnectionString))
    {
        conn.Open();
        using (var cmd = new SqlCommand(
               "UPDATE [aspnet_Membership] SET [PasswordFormat]=1", conn))
            cmd.ExecuteNonQuery();
    }

    foreach (var entry in passwords)
    {
        var resetPassword = hashedProvider.ResetPassword(entry.Key, null);
        hashedProvider.ChangePassword(entry.Key, resetPassword, entry.Value);
    }
}
12 голосов
/ 09 февраля 2011

Это подход, с которого я бы начал, чтобы увидеть, как далеко я продвинулся:

  1. Создайте два членства MembershipProvider в моем web.config, один для зашифрованных паролей и один для хэширования.
  2. Переберите всех пользователей, используя провайдера зашифрованных паролей.( SqlMembershipProvider.GetAllUsers )
  3. Получите пароль пользователя с помощью поставщика зашифрованных паролей.( MembershipUser.GetPassword )
  4. Измените пароль пользователя на тот же пароль, используя поставщика хешированного пароля.( MembershipUser.ChangePassword )

Так будет примерно так:

    <membership defaultProvider="HashedProvider">
        <providers>
            <clear />
            <add name="HashedProvider" connectionStringName="MembershipConnectionString" enablePasswordRetrieval="false"  requiresQuestionAndAnswer="false" applicationName="MyApp" passwordFormat="Hashed"  type="System.Web.Security.SqlMembershipProvider" />
            <add name="EncryptedProvider" connectionStringName="MembershipConnectionString" enablePasswordRetrieval="true" requiresQuestionAndAnswer="false" applicationName="MyApp" passwordFormat="Encrypted" type="System.Web.Security.SqlMembershipProvider" />
        </providers>
    </membership>

код:

SqlMembershipProvider hashedProvider = (SqlMembershipProvider)Membership.Providers["HashedProvider"];
SqlMembershipProvider encryptedProvider = (SqlMembershipProvider)Membership.Providers["EncryptedProvider"];

int unimportant;
foreach (MembershipUser user in encryptedProvider.GetAllUsers(0, Int32.MaxValue, out unimportant ))
{
    hashedProvider.ChangePassword(user.UserName, user.GetPassword(), user.GetPassword());
}
1 голос
/ 09 февраля 2011

По соображениям безопасности, безусловно, правильное решение - перейти с зашифрованных паролей на хеши в вашей базе данных.

Обычно для создания хэшей из ваших существующих зашифрованных паролей вы должны сначала расшифровать их, а затем хешировать. Имейте в виду, что вы потеряете (когда вы наконец переключитесь) оригинальные пароли. Вместо этого у вас будет уникальный отпечаток (хэш) паролей пользователей.

Подумайте также об использовании соли для хеширования (защита от радужных таблиц и т. Д.), А также посмотрите на алгоритмы медленного хеширования, такие как BCrypt ( Codeplex & Статья: Как безопасно хранить пароль ) по соображениям безопасности вместо быстрых, таких как MD5 .

Имейте также в виду, что в будущем будет гораздо больше усилий переключить алгоритм хеширования, чем изменить его с шифрования на хеш. Итак, вы хотите сделать это правильно с первого раза;)

0 голосов
/ 09 февраля 2011

Я бы предостерег вас от случайного хэширования ваших паролей, поскольку при таком подходе есть много предостережений. Это сообщение в блоге о хешировании паролей было очень проницательным для меня, и я думаю, что вы должны его прочитать. Почему вы хотите хешированные пароли вместо зашифрованных?

...