Разработка веб-приложения, которое автоматически поворачивает ключи шифрования, используемые для шифрования данных, хранящихся в базе данных.
Предполагая, что у меня есть приложение ASP.NET MVC 3, которое работает в веб-ферме, где каждый веб-сервер принадлежит рабочей группе (как, например, домен с общими учетными записями). Веб-ферма также автоматически масштабируется, что означает, что количество экземпляров зависит от нагрузки. Конфиденциальные данные шифруются и дешифруются при сохранении / извлечении из базы данных. Симметричные и асимметричные ключи хранятся на каждой машине и защищены ACL и шифруются с использованием DAPI (с использованием ключа машины).
Из соображений соответствия и безопасности необходимо регулярно менять ключи. Как бы вы разработали / изменили систему для автоматического поворота ключей через регулярные промежутки времени, не переводя систему в автономный режим? Предположим, что существует произвольное количество таблиц, каждая с произвольным числом столбцов, которые зашифрованы с использованием ключей.
Многие вопросы и ответы связаны с тем, какие алгоритмы использовать и как защитить ключи, однако немногие фактически касаются того, как спроектировать и реализовать приложение, которое позволяло бы поворачивать эти ключи, особенно в динамической среде (среде автоматического масштабирования), совместно использующей базу данных.
2 ответа
Наличие нескольких ключей в вашей системе
Когда у вас есть несколько кодировок (или схем шифрования, ключей), первое, что вы обычно хотите сделать, - это ввести какую-то схему управления версиями, так как вам нужно знать, какой ключ был использован для этого конкретного фрагмента данных. У вас есть несколько вариантов для этого:
- Отметки времени: сохраните отметку времени, когда данные были зашифрованы вместе с данными. Затем разделите время на интервалы некоторой длины, где используется один и тот же ключ.
- Номера версий: Вы также можете просто назначить увеличивающиеся номера версий.
- Отпечаток ключа: сохраняйте отпечаток ключа с данными
В любом случае вам необходимо хранить все ключи, которые используются в настоящее время, чтобы иметь возможность расшифровывать данные. При чтении данных просто найдите ключ, соответствующий вашему идентификатору версии, и расшифруйте. При записи используйте текущий активный ключ и сохраняйте зашифрованные данные + идентификатор вашей версии. Вы можете удалить (или удалить) ключ, если вы уверены, что в вашей базе данных нет данных, зашифрованных этим ключом.
Развертывание новых ключей
Всякий раз, когда вы переходите на новый ключ, этот ключ должен быть сгенерирован и развернут. Вы можете сделать это центральным способом или использовать некоторый протокол соглашения о распределенном ключе.
Повторное шифрование данных
Если вам нужно повторно зашифровать данные, вы можете сделать это двумя способами:
- Фоновый процесс: Наличие фонового процесса, который просто извлекает N элементов данных со старым идентификатором версий, расшифровывает и перекодирует его и сохраняет результат. Поспать немного между пробежками, чтобы не перегружать вашу систему.
- Обновление при доступе. Всякий раз, когда вы читаете данные и замечаете, что они имеют старый идентификатор контроля версий, повторно зашифруйте их с помощью текущего ключа и сохраните результат. Это может не перешифровать все в зависимости от вашего шаблона доступа к данным, поэтому может потребоваться дополнительный фоновый процесс.
Асимметричная криптография
Если вы используете асимметричную криптографию (я думаю, например, для хранения номеров кредитных карт, веб-серверов, имеющих только открытый ключ для шифрования, и платежного процессора, имеющих закрытый ключ для дешифрования), это становится немного сложнее, поскольку только машины с закрытыми ключами может повторно зашифровать данные. Все остальные аспекты одинаковы.
Keyczar от Google предоставляет такую платформу, но нет.Net-версии.
Может быть, вы могли бы обернуть версию C++ в оболочку.Net?