Начинаю разрабатывать проект, в котором будут участвовать важные данные, утечка которых грозит судами и прочим.
Хочу совета, как организовать шифрование этих данных.
Планирую шифровать данные чем-нибудь типа AES256, вопрос как хранить ключ? Если в файле, то человек, имеющий доступ к серверу, будет, получается, иметь и доступ к данным? Можно, конечно, разграничить права доступа на основе пользователей, но поможет ли это?
Прошу прощения, если вопросы нубские, пишу проект с шифрованием первый раз. Подскажите, или дайте ссылку на статью (можно на английском), где этот вопрос подробно разобран.
Доступ к серверу, как минимум, означает доступ к коду. Значит и к базе, хотя можно пароль в переменных окружения другого пользователя спрятать. Вопрос в том, как защитить ключ
Михаил: Смысл в том, чтобы те, чьи это данные, могли их просматривать/изменять. Естественно только в своем аккаунте. Получается, надо будет в сессии/куках постоянно пароль держать, чтобы данные расшифровывать?
Антон Иванов: в куках может храниться зашифрованный пароль - чтобы его нельзя было просто поиметь на клиенте, а в сессии будет лежать ключ от этого пароля, бесполезный для локального пользователя на сервере. Когда то и другое сойдется вместе (при запросе пользователя) - вы получите пароль для расшифровки. В остальное время пароль недоступен.
Adamos: хороший вариант. А какие минусы у него есть? :) АртемЪ: Пользователей на старте планируется около 100. Дальше, как пойдет. Возможно и несколько тысяч будет в будущем. Данные у каждого свои
Антон Иванов: Вам как и обычно нужно будет держать только токен, а пароль будет в это время храниться на сервере в открытом виде. Как только токен истечёт, пароль будет уничтожен
А чем дешифровка на стороне клиента не устраивает?
Храним на сервере зашифрованными, такими же отправляем клиенту, он их своим ключом дешифрует на своем компьютере.
Антон Иванов: Взлом будет возможен при получении доступа к серверу в момент, когда конкретный пользователь пользуется сервисом. Взломать смогут только такого пользователя. Плюс для взлома нужно хорошо знать как работает система, где хранится пароль пользователя в открытом виде, где хранятся дополнительные ключи (соль, которых может быть несколько). И как потом ещё это все расшифровать. К тому моменту взлом уже, скорее всего, будет обнаружен
Антон Иванов: минусы любого хорошо защищенного решения - в том, что у вас самого не будет ключа, чтобы расшифровать данные пользователя, потерявшего свой ключ ;)
АртемЪ: Можно поподробнее, как эти данные будут расшифровываться на клиенте?
Вкратце - это система для врачей, которые будут хранить медицинские карты своих пациентов и работать с ними (с картами) на сайте. Михаил: Спасибо, очень интересный вариант, проработаю его.
АртемЪ: Если данные объемные, а правятся незначительно - придется гонять туда-сюда весь объем вместо измененной части. Там, может, МРТ во всей красе с хорошим разрешением ;)
Adamos: Данные можно и по частям хранить (и шифровать) же :) Опять же, утечка только карт, без привязки к ФИО не так критична (но я буду все шифровать, возможно ФИО и карты по разному)
Антон Иванов: признаться, есть подозрение, что, если это действительно медицинские данные, рано или поздно понадобится доступ не одного пациента, а всего медперсонала, по уровням. Да еще и Минздрава, для статистики.
И вся обсуждаемая схема по этому поводу сразу свернется трубочкой и отправится в наиболее известный среди неспециалистов сфинктер.
Adamos: Значит тогда будем переходить на фиксированный ключ. Или писать новый сервис группового анализа (без изменения данных), куда будет возможна выгрузка из первого сервиса :)
Сгенерируйте ключ на отключенном от интернета ноутбуке, сделайте 2 резервных копии, а для работы запишите его на токен в неизвлекаемом режиме, ноутбук перезапишите. Токен используйте только на клиентской машине(-ах), на сервере храните только данные в зашифрованном виде.
Сервис должен быть доступным из любого места и с любого устройства. Данные, конечно, не такие серьезные, как банковские счета, но тоже достаточно серьезные (медицинские)
Ну тогда Вы слишком многого хотите. Конечные пользователи - одно из самых слабых звеньев в ИБ.
А если хотите чисто криптографическое решение (хотя я и не уверен, что оно лучшее в данной ситуации), то сгенерируйте мастер-ключ, зашифруйте им все данные на сервере, а потом генерируйте клиентские ключи и депонируйте на них мастер-ключ.
Если ваша задача - организация, то почему бы не посмотреть в сторону уже готовых СЗИ (средств защиты информации), Есть много наработок как на 152-ФЗ, так и по защите гос. тайны. Там предусмотрено многое, от доступа к ПК и его разблокировки путем прикладывания карт, до шифрования данных внутри контейнеров.
Если же Вам надо просто реализовать хранение, я использую Boxcryptor для предоставления данных нескольким людям.