Как ОС хранят ключи для зашифрованных данных
Интересно, как ОС хранят ключи, используемые для шифрования таких вещей, как пароли сайтов? После поиска в Интернете я нашел только два ответа, но они касаются только того, как поставщики услуг должны хранить пароли (они должны хранить хэш и соль), или как приложения должны хранить их (они должны использовать системные API, обеспечивающие шифрование).
Но я хочу знать, как система защищает ключи шифрования. Я знаю, что некоторые устройства имеют специальное оборудование для хранения некоторых важных ключей (например, Secure Enclave в чипах Apple). Но я хочу знать, как это будет сделано на обычном компьютере.
Я имею в виду, что они, вероятно, хранят это где-то на диске, но как они делают это безопасно, чтобы вы не могли просто прочитать это?
1 ответ
Практически каждое "безопасное хранилище учетных данных" делает это путем шифрования файла хранилища учетных данных на диске со случайным ключом, дополнительно зашифрованным парольной фразой. Без ключевой фразы вы не сможете получить доступ к ключу, необходимому для расшифровки содержимого. Вы также можете хранить ключ в криптоустройстве (например, смарт-карте NFC или USB-ключе), и они будут защищены их собственной системой вызова (парольная фраза, отпечаток пальца и т. Д.).
Ключевая фраза получена от пользователя непосредственно элементами ОС, так что подделка ее (например, веб-сайтом) будет более сложной, а также так, чтобы ни одно приложение не нуждалось в прямом доступе к хранилищу учетных данных - как только пользователь разблокирует хранилище, приложение может получить учетные данные, которые он изначально хранит, и только те. Для этого есть различные механизмы, но наиболее распространенным является использование идентификатора приложения исполняемого файла, который выдает запрос - с дополнительным ограничением, что исполняемый файл должен запускать только подписанные двоичные элементы (без вставки в библиотеку и т. Д.) И не должен подвергаться отладка (ОС полностью осведомлена об этом).
Что касается того, как ОС предотвращают утечку открытого текста, пока он остается в памяти? Хах. Это совсем другая история, и существует множество подходов - предотвращение перетекания данных в своп, использование зашифрованного свопинга, дешифрование только тех учетных данных, которые необходимы, и отказ от них, как только они не нужны, с участием ядра в управлении онлайн хранение (в ОЗУ) во время работы системы и использование ядра для выполнения всех криптографических операций, для которых требуется доступ, например, к асимметричным секретным ключам шифра. Ядро может далее передать это аппаратному устройству, в то время как ОС предоставляет унифицированный API независимо от того, где хранятся закрытые ключи. Такие API существуют в OS X и Windows, и, конечно, в Linux тоже.
Поскольку устройства TPM или USB, такие как устройства чтения криптокарт, могут надежно хранить закрытые ключи, для паролей действительно полезно использовать личные сертификаты, а не пароли. Затем устройство с закрытым ключом может подписать запрос с удаленного сервера (например, веб-сайта, поддерживающего сертификаты), и удаленная система проверяет подпись запроса на основе вашего открытого и, следовательно, не конфиденциального сертификата. Побочные заявления: я бы хотел, чтобы финансовые учреждения и повседневные сайты поддерживали личные пароли вместо паролей. Это более безопасно и абсолютно без проблем, и работает на всех платформах - даже мобильных!