Шаги для создания системы аутентификации пользователя между мобильным и сервером

1

Первый раз делает безопасный вход с мобильного приложения на сервер (встроенный в Java). Я хочу понять, правильно ли я это понял.

Вход в систему в первый раз:
1. На жестком коде мобильного устройства - фраза безопасности (например: "superSecurePhrase @@!!".
2. Введите имя пользователя и пароль.
3. Используйте base64 для кодирования имени пользователя + фразы и пароля + фразы.
4. Используя https, отправьте эту информацию на мой сервер.
5. На сервере декодируется с использованием base64 с соответствующей фразой, закодированной на устройстве.
6. Хеш-пароль и сохранить в БД, также хэш-имя пользователя и сохранить в БД.
7. Используйте алгоритм AES для создания токена сеанса
8. Отправка маркера сеанса на устройство.
9. Сохраните токен сеанса в БД и когда пользователь что-то попросит, убедитесь, что они совпадают.

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

Это общий шаблон, используемый для такого рода вещей?

Потенциальные уязвимости:
1. Физический доступ к устройству для извлечения кодированной фразы base64?
2. SSL Sniffing и получение токена?

Спасибо за помощь.

Теги:
encryption
ssl
https

1 ответ

1
Лучший ответ

Если бы я был на вашем месте, у меня был бы пароль с SHA-1/SHA-2 на устройстве при регистрации. Таким образом, я буду отправлять только хэш. Если запрос перехватывается человеком посередине, даже если они декодируют кодировку Base64, они будут иметь только хеш. В качестве конечного использования я буду бояться, если у кого-то мой сырой пароль, потому что я использую его в других местах (я знаю, что это плохая практика). Вы все еще можете Base64 кодировать хэш с солью.

Вы можете использовать свой "superSecurePhrase @@!!" солить строку пароля во время кодировки SHA-1/2 или иметь для этого отдельную соль.

Токен должен быть случайным для каждого поколения (он остается неизменным до истечения срока его действия), я бы использовал что-то вроде org.apache.commons.lang.RandomStringUtils, предполагая, что вы используете Java на сервере.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню