В нашем приложении для Google App Engine хранится достоверное количество личной информации (электронная почта, ssn и т.д.) для идентификации пользователей. Я ищу советы о том, как защитить эти данные.
Моя текущая стратегия
Хранить конфиденциальные данные в двух формах:
- Хешинг - использование SHA-2 и соли
- Шифрование - использование открытого/закрытого ключа RSA
Когда нам нужно посмотреть вверх:
- Выполнять поиск хэшированных данных (хешировать PII в запросе, сравнивать его с хэшированным PII в хранилище данных).
Если нам когда-либо понадобится повторно использовать данные или иначе обрабатывать их в необработанном виде:
- Расшифруйте зашифрованную версию с помощью нашего закрытого ключа. Никогда не храните его в необработанном виде, просто обработайте его, затем повторно запишите и заново зашифруйте.
Мои проблемы
Сохранение нашей секретной соли хешей
Если злоумышленник получает данные в хранилище данных, а также нашу хеш-соль, я беспокоюсь, что они могут переборщить конфиденциальные данные. Некоторые из них (например, SSN, 9-значное число) не имеют большого ключевого пространства, поэтому даже с использованием современного алгоритма хэша я считаю, что это можно сделать, если злоумышленник знал соль.
Моя нынешняя идея - сохранить соль вне контроля источника и в ней собственный файл. Этот файл загружается в GAE во время развертывания, и приложение считывает файл, когда ему нужно хешировать входящие данные.
В промежутках между развертываниями солевой файл живет на USB-ключ, защищенный сердитым медведем (или сейфом).
С солью, живущей только в двух местах
- Клавиша USB
- Развернуто для приложений Google.
и с полной загрузкой кода, я не могу придумать, как кто-то может получить соль, не крадя этот USB-ключ. Я что-то пропустил?
Сохранение секретности секретного ключа RSA
Меньше беспокоиться об этом. Редко будет нужно расшифровать зашифрованную версию (только если мы изменим хэш-алгоритм или формат данных).
Частный ключ никогда не должен касаться сервера GAE, мы можем вытащить зашифрованные данные, локализовать его локально, обработать и повторно загрузить зашифрованные/хешированные версии.
Мы можем хранить наш секретный ключ RSA на USB-накопителе, охраняемом медведем и тигром, и выводить его только тогда, когда нам это нужно.
Я понимаю, что этот вопрос не совсем специфичен для Google Apps, но я думаю, что GAE делает ситуацию несколько уникальной.
Если бы у меня был полный контроль, я бы делал такие вещи, как блокирование доступа к развертыванию и доступ к средству просмотра хранилища данных с двухфакторной аутентификацией, но эти параметры недоступны в данный момент (наличие специального пароля GAE хорош, но мне нравится иметь токены RSA).
Я также не эксперт по GAE и эксперт по безопасности, поэтому, если у меня пропала дыра или что-то, о чем я не думаю о конкретной платформе, мне бы очень хотелось ее услышать.