Сохранение секретности API пользователя SHA в БД

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

В заголовке каждого запроса к серверу я ставлю:

"key":  username
"sign": (SHA256 of post_parameters using API secret)

Сервер принимает параметры post_parameters и SHA256, используя уникальный секретный ключ API, найденный в db. Если результат соответствует "подписи", то доступ предоставляется.

У меня вопрос такой:

Как сохранить секрет уникального API каждого пользователя на сервере БД? Если кто-то получает доступ к именам пользователей и их секретам API, он полностью контролирует учетную запись пользователя.

1 ответ

Решение

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

Чтобы сделать его еще более безопасным, вы можете рассмотреть возможность использования salt: хранить случайное значение (в виде открытого текста) в базе данных также для каждого пользователя, а затем, когда вы вычисляете хеш, вы хешируете соль и секрет. Так вы храните

salt_value  H(salt_value . secret)

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

Для ультрасовременной безопасности вы также можете многократно хешировать. Вместо хранения

H(salt_value . secret)

вы храните

H(H(H(H(...H(salt_value . secret) ...))))

то есть, вы хешируете это большое количество раз (скажем, 10000 раз). Когда пользователь входит в систему, неоднократно хешируйте соль и секрет, а затем сравнивайте конечный результат с сохраненным значением. Это еще более безопасно, потому что для атаки методом грубой силы требуется гораздо больше времени: злоумышленнику придется вычислить 10000 хэшей, чтобы сделать одно предположение о секрете.

Другие вопросы по тегам