Довольно старый вопрос, но для протокола я описываю то, что я определил, как свое собственное решение, которое выглядит для меня защищенным.
Когда администратор создает свою учетную запись, я генерирую случайный ключ шифрования. Этот ключ затем шифруется в AES с использованием пароля администратора и сохраняется в базе данных. Пароль администратора также защищен (путем хэширования или любого другого кодировщика пружинных паролей). На этом этапе никто не может получить доступ к реальному ключу шифрования.
Когда администратор входит в систему, он дает простой пароль, который сравнивается с зашифрованным паролем пользователя. Если он правильный, он используется для расшифровки пароля шифрования и забыт. Пароль шифрования затем сохраняется в сеансе. Это единственная уязвимость этого механизма - если кто-то взломает сервер и создаст дамп памяти, сможет получить доступ к паролям, но только для зарегистрированных пользователей и никогда не иметь только приложение или базу данных. В настоящее время я думаю о том, чтобы добавить еще один уровень безопасности (например, шифрование паролей в памяти, например, время входа пользователя). Но, в любом случае, даже если вы требуете от пользователя вводить пароль при каждом запросе, вы не можете гарантировать, что он будет удален из памяти GC, и вам нужно будет сохранить его в памяти в какой-то момент.
Итак, пользовательский сеанс знает пароль шифрования, который затем используется для шифрования и дешифрования. Когда администратор создает новых пользователей, он имеет доступ к незашифрованному паролю во время этого - когда он вводит новый пароль для нового пользователя, есть еще одна копия зашифрованного пароля, созданная и сохраненная в БД, зашифрованная этим паролем пользователя и т. Д.
Видите ли вы какие-либо другие уязвимости этого механизма, кроме того, что кто-то взламывает работающий сервер и сбрасывает память?