ProtectedData.Unprotect после изменения пользователем пароля

У меня есть приложение C#, которое хранит информацию о пароле в базе данных, используя ProtectedData учебный класс. Я использую сферу local machine и как я понимаю DPAPI буду использовать master key зашифровать его, и он не будет изменен, если я не деинсталлирую ОС.

Допустим, я хочу использовать область DataProtectionScope.CurrentUser, Как я понимаю, тогда используются разные master key это защищено паролем пользователя. Поэтому, когда пользователь меняет пароль, главный ключ, с помощью которого он защищал данные, остается прежним, и только пароль, который защищает его, изменяется.

Мой вопрос: мои данные (в базе данных) могут быть восстановлены (и как) после того, как Пользователь изменяет пароль?

2 ответа

Решение

Посетите этот сайт, на котором есть ссылки на статьи (и, что более важно, код) для обратного проектирования системы. Их первая презентация была на Blackhat Europe 2010.

По сути, хэш SHA-1 текущего пароля защищает мастер-ключи DPAPI, которые, в свою очередь, защищают каждый DPAPI-блоб (также присутствует соль для каждого блоба). Каждый мастер-ключ имеет GUID, который идентифицирует пароль, который используется для его защиты. Каждый BLOB-объект также имеет GUID, который определяет, какой мастер-ключ использовался для его шифрования. Срок действия этих мастер-ключей истекает через три месяца, и создается новый, но старые сохраняются.

Если вы измените пароль, все мастер-ключи будут повторно зашифрованы с использованием нового хэша SHA-1, но в качестве страховки (например, процесс может прерваться) старый хеш-код SHA-1 также будет сохранен, зашифрован с использованием нового хэша SHA-1 (и старый и новый пароль GUID) (в файле с именем CREDHIST рядом с мастер-ключами), чтобы гарантировать, что все большие двоичные объекты всегда расшифровываются с текущим паролем, прямо или косвенно. Таким образом, если вы знаете текущий, вы можете найти хеши паролей всех ваших старых паролей, цепочкой обратно. Все эти парольные защиты в masterkeys и CREDHIST также используют S-ID пользователя (поэтому, если это изменится, например, после переустановки Windows, вы больше не сможете расшифровывать старые BLOB-объекты.).

Обратите внимание, что если вы вручную измените пароль локального пользователя, вы получите следующее предупреждение, и все данные, которые были зашифрованы с помощью ProtectedDataс DataProtectionScope.CurrentUserэтого пользователя будет потерян/недоступен , как и в предупреждении:

Другие вопросы по тегам