App Engine и шифрование
Август 5th, 2008Оригинал статьи – http://blog.appenginefan.com/2008/04/appengine-and-encryption.html
Одна из наиболее значимых возможностей, которую просят компанию Google реализовать в первую очередь разработчики в AppEngine – это поддержка шифрования через SSL. Хотя и нет сомнений, что она будет реализована в ближайшее время, хотелось бы изучить варианты того, как можно сделать работу приложения безопаснее в текущей версии. По крайней мере в век Web 2.0 не может быть ничего невозможного.
Представьте, что мы начинаем разработку с нуля нового приложения. Большая часть данных приложения не требует никакого шифрования (страницы html, логотип компании, стили css…). Давайте предположим, что нас не пугает Javascript и попробуем его задействовать для обмена информацией через XmlHttpRequest. Что мешает нам шифровать все данные, до того, как они будут переданы через сеть? Таким образом необходимо, чтобы и клиент, и сервер выбрали общий метод шифрования данных.
Необходимые ингредиенты:
- реализация алгоритма RSA на чистом языке Python
- реализация алгоритма RSA на JavaScript
- реализация алгоритма AES на Python и Javascript
(Я не проводил тестирование этих компонентов, поэтому вам необходимо сделать это самостоятельно).
Представьте что приложение работает под AppEngine и мы загрузили вместе с его кодом пару публичный/приватный ключ. Ничто не мешает нам сделать следующее:
- поместить публичный ключ в один из файлов со скриптами Javascript, которые загружаются вместе с приложением. В этом случае, код на Javascript в клиенте может зашифровать данные, отправляемые в сторону сервера.
- после инициализации, клиент на Javascript создает случайный ключ для шифрования по алгоритму AES. Он шифрует эти данные с использованием публичного ключа сервера и сохраняет их в cookie, отправляемый серверу.
- мы создаем собственную версию функции XmlHttpRequest, которая будет шифровать все данные с помощью AES до того, как отправлять их в сеть
- сервер получает зашифрованные данные, извлекает ключ из зашифрованного cookie и использует его для расшифровки данных
- когда серверу требуется отправить данные обратно, он использует полученный ключ от клиента и зашифровывает им сообщение
Я не пробовал этот метод в реальной работе, поэтому не имею ни малейшего представления, какое это может оказать влияние на квоты приложения (процедура шифрации/дешифрации на чистом языке Python может отнимать много ресурсов). Также неизвестно, как быстро будет работать AES на строне клиента. Если кто-нибудь, попробовал реализовать эти идеи в жизнь, дайте знать.