Как зашифровать и расшифровать на клиенте, который может прийти с другого устройства, и сервер не хранит зашифрованный ключ? - PullRequest
0 голосов
/ 30 октября 2019

Я создаю такой инструмент управления паролями, как Lasspass, для себя и своей семьи, но у меня возникли некоторые проблемы с безопасностью. После прочтения LastPass-Technical-Whitepaper мне очень интересно, как они делают это только на стороне клиента. Согласно описываемой ими «Модели локального шифрования», сервер хранит только зашифрованную информацию. Означает ли это, что они не хранят какой-либо ключ или IV или соль для расшифровки AES на своей стороне сервера? Насколько я знаю, это может быть хорошо, если я шифрую и дешифрую на том же устройстве, но я использую Lasspass, чтобы добавить пароль на компьютер, но я вижу пароль на мобильном телефоне. Как они расшифровывают это на мобильном телефоне? Если мобильный телефон не имеет ключа и IV и соль для шифрования на стороне компьютера, не так ли?

В настоящее время я использую ASP.NET Core 3.0 + React + удостоверение личности

Как следуетдействительно безопасная «Модель локального шифрования» будет реализована? Может ли кто-нибудь дать мне какое-то направление? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 30 октября 2019

первый: я не знаю ни о реализации lastpass, ни о работе

, но давайте посмотрим, что мы можем сделать ...

скажем, у нас есть сервер, которыйхранит двоичные данные для нас, и, кроме того, он делает это для каждого пользователя / учетной записи ...

что нам нужно, чтобы иметь возможность авторизовать такие функции учетной записи, как "заменить данные" или "запросить сохраненные данные"?

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

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

одно из возможных решений довольно простое и начинается с ... PBKDF2 ... Функция извлечения ключа из производного пароля

PBKDF2 принимает пароль, соль, параметр для количества раундов и дает вам... биты ... рслучайные биты

Возьмите свое имя пользователя и хэшируйте его ... => идеальная соль ...
Возьмите произвольное число, например, 15000 => количество ваших раундов (большие числа замедляют процесс вычисления-> замедление атак грубой силы, в то время как вам нужно рассчитать его только один раз при каждом входе в систему)
Взять ваш пароль => Удивить ... пароль

запустить PBKDF2

seed your любимый CSPRNG (Криптографически безопасный генератор псевдослучайных чисел) с несколькими байтами из результирующего потока битов

используйте ваш любимый CSPRNG для генерации новой (RSA, DSA, ECDSA, как угодно) пары ключей ...

используйтеключ

эта пара ключей EXACT будет сгенерирована КАЖДЫЙ раз, когда вы выполняете эти шаги, на любом устройстве

, конечно, это нарушает безопасность указанной пары ключей до уровня секретных параметров для PBKDF2,который будет ... вашим паролем

, но теперь у вас есть асимметричное шифрование из пароля ...

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

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

...