Многие пользователи, в том числе и я, хотели бы, чтобы все, что они делают в веб-сервисе, было зашифровано.То есть они не захотят, чтобы кто-то в веб-сервисе мог просматривать их: сообщения, информацию, задачи и т. Д. *
Это также основная жалоба в этом обсуждениив остальном классный сервис: http://news.ycombinator.com/item?id=1549115
Поскольку эти данные необходимо восстановить, требуется своего рода двустороннее шифрование.Но если вы не запрашиваете у пользователя ключ шифрования при каждом запросе, этот ключ необходимо будет сохранить на сервере, и точка шифрования данных будет в основном потеряна.
Что такое способ безопасногошифровать пользовательские данные, не ухудшая пользовательский опыт (запрашивая ключ для каждого запроса)?
- ОБНОВЛЕНИЕ -
Из ответа @ Borealid я сосредоточилсяна две возможности: протоколы ответа на вызов, где данные (включая пароль) не отправляются в «чистом» режиме, и протоколы без ответа, где данные (включая пароль) отправляются в «чистом» (хотя и через HTTPS).
Протоколы вызовов-ответов (в частности, SRP: http://srp.stanford.edu/)
Похоже, что для его реализации потребуется либо полностью AJAX-сайт, либо использование веб-хранилища. Это такбраузер может сохранять данные запроса-ответа во время шифрования, а также ключ шифрования между различными «страницами». (Я предполагаю, что после завершения аутентификации яотправил бы им обратно зашифрованный ключ шифрования, который они расшифровали бы на стороне клиента, чтобы получить настоящий ключ шифрования.)
Проблема в том, что я либо:
- полностью AJAXМне это не нравится, потому что я люблю URL-адреса и не хочу, чтобы пользователь жил исключительно по одному URL-адресу, или
- Я должен хранить ключи шифрования данных в веб-хранилище, основанном на http://dev.w3.org/html5/webstorage/ будет сохраняться даже после закрытия браузера и может быть уязвимостью безопасности
Кроме того, поскольку SRP принимает более одного запроса (http://srp.stanford.edu/design.html), необходимобыть некоторой настойчивостью на стороне сервера.Это просто еще одна трудность.
Традиционно
Если я в порядке и передаю пароли и данные в открытом виде (хотя и через HTTPS), то проблемы на стороне клиента вышеотсутствуют.
При регистрации я сгенерирую случайный уникальный ключ шифрования для пользователя и зашифрую его, используя его пароль и случайную соль.
В базе данных я будухранить хэш и соль пароля пользователя (через bcrypt), зашифрованный ключ шифрования, соль ключа шифрования и шифрование iv.
После аутентификации мне также потребуется использовать их пароль для расшифровки ключа шифрования, чтобыони могут просматривать и вводить новые данные.Я храню этот ключ шифрования только временно и удаляю его, когда они явно «выходят из системы».
Проблемы с этим подходом состоят в том, что (как указывает @Borealid) злые системные администраторы могут все еще просматривать ваши данные, когда вы вошли в систему.в.
Я также не уверен, как хранить ключи шифрования, когда пользователи вошли в систему. Если они находятся в одном и том же хранилище данных, украденная база данных покажет все данные тех, кто был зарегистрирован ввремя кражи.
Существует ли лучшее хранилище данных в памяти для хранения этих ключей шифрования (и запроса данных во время аутентификации SRP)?Для этого Redis подойдет?