Надежно хранить дополнительную энтропию при использовании DPAPI

StackOverflow https://stackoverflow.com/questions/2585746

Вопрос

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

Итак, мой вопрос - какой лучший способ хранить энтропию с помощью DPAPI?

Это было полезно?

Решение

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

Я собираюсь обратиться к вашей энтропии в качестве вашего Ключ, поскольку это функционально дополнительный ключ.

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

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

В какой-то момент вы понадобится какой-то ключ, жесткий в вашем приложении. Этот ключ либо в сочетании с некоторыми другими данными в хеш для создания ключа Entropy или используется для расшифровки клавиши энтропии. У вас на самом деле может быть изменение ключа с новым ревизом вашего приложения, если вы сохраняете старый ключ для расшифровки существующего ключа. Затем вы можете повторно зашифровать его новым ключом или методом.

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

Что бы вы ни делали, имейте в виду, что он будет скомпрометирован - что всегда происходит, когда у кого-то есть полный доступ к локальной машине, а данные, хранящиеся на нем. Решение того, чтобы продолжать выпустить обновления, которые меняют способу достаточно, чтобы старая трещина больше не работает. Это сделает распределение трещины менее ценно, так как будет трудно найти один для правильной версии.

Другие советы

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

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

Учитывая все это, я бы предложил создать службу WCF (фонда Windows Communication), которая используется для извлечения конфиденциальной информации. Это, очевидно, может быть использовано для извлечения всей информации, но наименьшее количество изменений было бы ограничить службу к конфиденциальной информации.

С WCF вы можете настроить как клиент, так и сервер для использования защищенного канала. WCF имеет много вариантов для установления безопасного канала связи с сервером.

<wsHttpBinding>
    <binding>
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</wsHttpBinding>

После того, как у вас есть безопасный канал, многие другие проблемы проще, например, доступ к данным CC. Если эти данные отправляются по безопасному каналу, он становится проблемой авторизации вместо канала безопасности.

Видеть Как: создать безопасный сеанс для большего.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top