Сохранение секретности 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 хэшей, чтобы сделать одно предположение о секрете.