Если я правильно понимаю, ваш текущий протокол выглядит следующим образом:
server -> client: random nonce
server <- client: encrypted password
server <- client: encrypted password
Клиент не должен отправлять свой пароль снова и снова, и я бы порекомендовал вам использовать токен доступа в вашем протокол. Токен доступа («токен аутентификации», «идентификатор сеанса») - это большое случайное значение, которое сервер возвращает в качестве ответа аутентификации:
server <- client: encrypted password
server -> client: 256-bit access token
server <- client: 256-bit access token
server <- client: 256-bit access token
Это управление сеансом. NIST предоставляет рекомендации по управлению сеансами: https://pages.nist.gov/800-63-3/sp800-63b.html#sec7
Управление сеансами предпочтительнее, чем постоянное представление учетных данных, поскольку плохое удобство использования непрерывного представления часто создает стимулы для обходных путей, таких как разблокировка кэша учетные данные, отрицая свежесть события аутентификации.
Клиент хранит токен доступа в памяти и использует его вместо пароля. Если вы хотите сохранить токен доступа между запусками приложения, вам нужно сохранить его безопасно, и это зависит от ОС клиента:
- Android: KeyStore.
- iOS: цепочка для ключей.
- Linux / Windows / MacOS: здесь сложно - просто держите токен в памяти как можно дольше, не помещайте в файл, заставляйте приложение работать как можно дольше.
В любом случае, токен доступа должен истечь через некоторое время, и даже если он по какой-то причине просочится, клиент получит новый через некоторое время. См. Часть о повторной аутентификации в NIST .