Как можно зашифровать серверную сторону данных пользователей, не разрушая опыт?

Многие пользователи – самостоятельно включенный – хотели бы безопасность наличия всего, что они делают на зашифрованном веб-сервисе. Таким образом, они не делают не будет никто в веб-сервисе, чтобы смочь посмотреть на их: сообщения, информация, задачи, и т.д...

Это - также главная жалоба в этом обсуждении в других отношениях прохладного сервиса: http://news.ycombinator.com/item?id=1549115

Так как эти данные должны быть восстанавливаемыми, своего рода двухстороннее шифрование требуется. Но если Вы не предлагаете пользователю ключ шифрования по каждому запросу, этот ключ должен будет быть сохранен на сервере, и точка шифрования данных в основном потеряна.

Что путь состоит в том, чтобы надежно зашифровать пользовательские данные, не ухудшая пользовательский опыт (просьба о некоторых включают каждый запрос)?

- ОБНОВЛЕНИЕ-

Из ответа @Borealid я сфокусировался на двух возможностях: протоколы ответа проблемы, где никакие данные (включенный пароль) не представляются "четкие", и non-challenge-response протоколы, где данные (включенный пароль) представляются "ясное" (хотя по 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 был бы хорош?

12
задан Rakesh Sankar 29 August 2011 в 10:45
поделиться

3 ответа

Если вы хотите выполнять вычисления на сервере без того, чтобы сервер мог видеть данные, вам может быть интересно узнать о полностью гомоморфном шифровании. Схема полностью гомоморфного шифрования позволяет выполнять произвольные вычисления на зашифрованных данных, даже если вы не можете их расшифровать. Однако это все еще является предметом исследований.

На данный момент, я думаю, лучшим вариантом будет шифрование всех сообщений и присвоение бессмысленных (например, последовательных) идентификаторов каждому из них. Более подробное обсуждение того, как шифровать данные на стороне сервера с помощью современных технологий, смотрите здесь.

1
ответ дан 2 December 2019 в 23:31
поделиться

Если данные необходимо восстановить в случае ошибки пользователя, вы не можете использовать что-то вроде cookie (который может быть удален). И, как вы указываете, ключи на стороне сервера на самом деле не защищают пользователя от злонамеренных системных администраторов; они помогают только с такими вещами, как кража баз данных в автономном режиме.

Однако, если вы используете обычную веб-службу, вам уже очень повезло - пользователь, чтобы быть уникальным и не эфемерным, должен войти в систему . Это означает, что они проходят некоторый этап аутентификации, подтверждающий их личность. Чтобы подтвердить свою личность, большинство веб-сайтов используют переданные учетные данные (пароль).

Пока вы не используете протокол аутентификации запрос-ответ, который не используется на большинстве веб-сайтов, вы можете использовать ключ шифрования, полученный из комбинации секрета на стороне сервера и пароля пользователя. Храните ключ шифрования только тогда, когда пользователь аутентифицирован.

Если вы сделаете это, пользователи по-прежнему будут уязвимы для системных администраторов, которые могут подглядывать, пока они используют службу (или крадут их пароли). Возможно, вы захотите пойти еще дальше. Чтобы перейти на один уровень выше, вообще не отправляйте пароль на сервер.Вместо этого используйте протокол «запрос-ответ» для аутентификации на своем веб-сайте и зашифруйте данные с помощью пароля пользователя с помощью JavaScript перед загрузкой чего-либо.

Это надежная защита: если вы попытаетесь украсть пароль пользователя, он сможет увидеть, что вы делаете, потому что код для кражи находится прямо на странице, которую вы ему отправили. Ваш веб-сервис никогда не касается своих данных в незашифрованном виде. Это также не помеха для нормального взаимодействия с пользователем. Пользователь просто вводит свой пароль для входа в систему, как обычно.

Этот метод используется облачной службой хранения Lacie. Сделано очень хорошо.

Примечание: когда я говорю «используйте foo для шифрования», я на самом деле имею в виду «используйте foo для шифрования безопасного симметричного ключа, который затем используется со случайной солью для шифрования». Знайте свою криптографию. Я говорю только о секрете, а не о методологии.

2
ответ дан 2 December 2019 в 23:31
поделиться

Ни одно из этих других решений не будет поддерживать запрашиваемый набор функций - который, в частности, хочет сохранить пользовательский опыт. Если вы посмотрите на сайт, указанный в ссылке, они отправляют вам по электронной почте ночную запись из прошлого журнала. Вы не получите этого с помощью хитрости JavaScript, как описано выше, потому что у вас нет браузера, на который можно положиться. В общем, все это ведет вас по пути к ухудшению пользовательского опыта.

То, что вам нужно, или, точнее, лучшее решение, которое вы найдете в этой области, это не столько то, что делает wuala, как указано выше, сколько что-то вроде hush.com. Работа с пользовательскими данными должна постоянно осуществляться на стороне клиента - обычно это достигается с помощью Java на стороне клиента (например, загрузка фотографий в Facebook и т.д.), но в наши дни можно обойтись и HTML/JavaScript. Шифрование JavaScript довольно плохое, поэтому его лучше игнорировать.

Итак, теперь у вас есть Java на стороне клиента, работающая со службой шифрования записей в журнале. Следующей функцией было отправление записей из прошлого журнала пользователям по электронной почте каждую ночь. Ну, вы не получите это в незашифрованном электронном письме. Здесь вам придется изменить пользовательский опыт в ту или иную сторону. Самое простое решение - не отправлять запись по электронной почте и вместо этого предоставить, например, браузер записей в журнале в приложении Java, который напомнит им о какой-то старой записи, как только они попадут на веб-сайт по ссылке в ежедневном электронном письме. Гораздо более сложным решением было бы использование JavaScript-шифрования для расшифровки записи как вложения в электронном письме. Это не ракетостроение, но в этом случае придется прибегнуть к довольно большому количеству хитростей. Это общий путь, используемый несколькими веб-службами шифрования электронной почты, такими как IronPort. Вы можете получить демонстрационное письмо, перейдя по адресу http://www.ironport.com/securedemo/.

Как бы мне ни хотелось увидеть правильно зашифрованную версию всего этого, мой последний комментарий заключается в том, что записи в дневнике не являются государственной тайной. При наличии надежной политики конфиденциальности и хорошей семантики безопасности сайта, я уверен, что 99% ваших пользователей будут чувствовать себя прекрасно. Чтобы сделать все это правильно и с настоящей безопасностью, потребуется огромное количество усилий, как указано выше, и, по крайней мере, некоторые изменения в дизайне/UE.

1
ответ дан 2 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: