Область API защиты данных: LocalMachine и CurrentUser

У нас есть приложение, которое шифрует/дешифрует данные как DataProtectionScope.LocalMachine. Теперь нам нужно изменить область действия на DataProtectionScope.CurrentUser.

Будут ли существующие строки, зашифрованные в области LocalMachine, по-прежнему доступны для чтения, когда область будет изменена на CurrentUser, если, конечно, пользователь вошел в систему на том же компьютере?

РЕДАКТИРОВАТЬ: я написал очень быстрое и грязное тестовое приложение. Как ни странно, на одном компьютере я могу расшифровать строку, зашифрованную в области LocalMachine или CurrentUser, как в области LocalMachine, так и в области CurrentUser. Это не похоже на правильное поведение, помогите!

    private void btnUserEncrypt_Click(object sender, EventArgs e)
    {
        //encrypt data
        var data = Encoding.Unicode.GetBytes(txtUserEncrypt.Text);
        byte[] encrypted = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

        txtUserEncrypt.Text = Convert.ToBase64String(encrypted);
    }

    private void btnUserDecrypt_Click(object sender, EventArgs e)
    {
        byte[] data = Convert.FromBase64String(txtUserDecrypt.Text);

        //decrypt data
        byte[] decrypted = ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
        txtUserDecrypt.Text = Encoding.Unicode.GetString(decrypted);
    }

    private void btnMachineEncrypt_Click(object sender, EventArgs e)
    {
        //encrypt data
        var data = Encoding.Unicode.GetBytes(txtMachineEncrypt.Text);
        byte[] encrypted = ProtectedData.Protect(data, null, DataProtectionScope.LocalMachine);

        txtMachineEncrypt.Text = Convert.ToBase64String(encrypted);
    }

    private void btnMachineDecrypt_Click(object sender, EventArgs e)
    {
        byte[] data = Convert.FromBase64String(txtMachineDecrypt.Text);

        //decrypt data
        byte[] decrypted = ProtectedData.Unprotect(data, null, DataProtectionScope.LocalMachine);
        txtMachineDecrypt.Text = Encoding.Unicode.GetString(decrypted);
    }

person Marcus    schedule 03.10.2013    source источник


Ответы (1)


При расшифровке данных, зашифрованных с помощью DPAPI, область защиты данных игнорируется.

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

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

person Alek Davis    schedule 23.11.2013
comment
@Alex Davis Какие параметры используются для шифрования данных в области локального компьютера? Пароли не задействованы? Насколько легко взломать блобы локальной машины с помощью реверсивных инструментов? Пожалуйста посоветуй - person techno; 07.06.2015
comment
@techno: параметры описаны в определении API для CryptProtectData и CryptUnprotectData. См. пример на obviex.com/samples/dpapi.aspx. Я не уверен, какой пароль (кодовая фраза) используется для ключа, возможно, какое-то значение защищено LSA. Вариант с локальной машиной было бы легче сломать, запустив вредоносную программу на машине, чем реконструировать (здесь я размышляю). В общем, я бы не рекомендовал использовать машинный прицел. - person Alek Davis; 08.06.2015
comment
Спасибо за ваш ответ. Я не ищу отказоустойчивый механизм. Я думаю, что даже если я буду использовать область действия локальной машины, для доступа к секрету потребуется много технических навыков. Плюс, чтобы добавить дополнительную энтропию, я бы использовал секрет, известный приложению только. Что вы думаете? - person techno; 08.06.2015
comment
Это лучше, чем обычный текст, но все же не очень безопасно. - person Alek Davis; 08.06.2015
comment
@AlekDavis Что тогда будет использоваться для пользовательского контекста? Это что-то хранится в профиле AD пользователя, учитывая, что он передается с машины на машину? Мне интересно, какова будет долговечность этих зашифрованных данных. Будет ли зашифрованная информация по-прежнему расшифровываться спустя месяцы или годы? Или это привязано к чему-то вроде пароля пользователя? - person duct_tape_coder; 30.04.2019
comment
@duct_tape_coder: я не видел никаких подробностей о том, как Microsoft делает это внутри, но пользовательский контекст работает после смены пароля. Единственный раз, когда он ломается, это когда администратор сбрасывает пароль локальной (не доменной) учетной записи. - person Alek Davis; 30.04.2019
comment
@AlekDavis Это немного устарело, но информативно: support.microsoft.com/en-us/help/309408/ Также стоит отметить риски использования DPAPI: harmj0y.net/blog/redteaming/ - person duct_tape_coder; 01.05.2019
comment
@AlekDavis привет! кажется, вы знакомы с DPAPI. возможно, вы знаете причину моего поведения DPAPI. пожалуйста, взгляните на мой вопрос сбой с неверными данными"> stackoverflow.com/questions/60230456/ - person cerberus; 19.02.2020
comment
@cerberus: я прочитал ваше описание, но все еще не понимаю, что вы делаете. - person Alek Davis; 19.02.2020
comment
@AlekDavis У меня есть веб-приложение с REST-api, и теперь я создаю настольное приложение для работы с этим API. мне нужно получить сеанс локального пользователя из браузера Chrome (мне не нужно создавать новый сеанс по некоторым причинам, я могу объяснить, если хотите). сеанс является значением файла cookie. файлы cookie, хранящиеся в базе данных SQLite. я могу прочитать значение, но оно защищено через DPAPI и метод Unprotect не работает. вы сказали, что область защиты данных игнорируется во время снятия защиты, потому что метаданные BLOB хранят ее. что я делаю не так?) - person cerberus; 20.02.2020
comment
Я отвечу на ваш пост. - person Alek Davis; 20.02.2020