Использование одного секрета для генерации totp против нескольких секретов

Я хочу использовать аутентификатор Google и алгоритм totp для 2fa на своем веб-сайте. У меня есть 2 вопроса по генерации QR-секрета.

Я планировал использовать хранилище для более безопасного хранения секретов, но мой вопрос: есть ли другой способ генерировать секрет каждый раз вместо того, чтобы хранить его в каком-то хранилище?

Я читал в руководствах, что мне нужно использовать случайный секрет для каждого пользователя и хранить этот секрет в БД для проверки otp.

Моя идея заключалась в том, чтобы хранить определенный секрет в безопасном месте и генерировать хеш, используя этот секрет для каждого пользователя. Например, сгенерируйте хеш, используя mySecret + userId

Это безопасный способ?


person taraf    schedule 03.07.2019    source источник
comment
Какой смысл создавать хеш?   -  person zerkms    schedule 04.07.2019
comment
Таким образом, я могу каждый раз генерировать секрет для этого конкретного пользователя без использования какой-либо внешней базы данных или серверной части. Мне нужно сохранить только один секрет - zerkms   -  person taraf    schedule 04.07.2019
comment
Звучит разумно (например, используйте SHA256 для генерации пользовательского секрета из главного секрета + идентификатора пользователя). Однако, если секрет пользователя скомпрометирован, вы должны дать им новый ID (вероятно, нежелательно). Также, если главный секрет скомпрометирован, вы должны предоставить всем новый секрет (через QR или что-то еще). У меня вопрос: почему проще хранить один секрет, чем один для каждого пользователя?   -  person AJR    schedule 04.07.2019
comment
Вы можете использовать Transit Backend Сейфа для получения ключей для пользователей (используя идентификатор пользователя в качестве контекста для ключей данных или HMAC, например), хотя я должен признать, что не понимаю, почему вы пытаетесь это сделать. Возможность воспроизвести ключ шифрования, как правило, плохо по той же причине, по которой мы не храним пароли в воспроизводимой форме.   -  person Peter    schedule 04.07.2019
comment
Моя идея заключалась в том, чтобы хранить определенный секрет в безопасном месте. Но разве Убежище не является безопасным местом?   -  person Peter    schedule 04.07.2019
comment
Я хотел сохранить главный секрет в безопасном месте, например, в хранилище или секрете k8s, но сгенерировать односторонний секрет для каждого пользователя, используя SH256 с masterSecret + userId, и снова сгенерировать секрет, когда мне нужно проверить код пользователя. - Питер   -  person taraf    schedule 04.07.2019
comment
Я верю, что этого не произойдет. Потому что, если кто-то сможет найти способ получить доступ к нашему кластеру VPC и k8s и таким же образом увидеть мастер-пароль, он также получит доступ к Vault или БД. Думаю, уровень безопасности будет таким же. Спасибо за ответ - AJR   -  person taraf    schedule 04.07.2019


Ответы (1)


Использование главного секрета и создание секрета пользователя с помощью sha256 было плохой идеей. Сгенерированный Becuase секрет и QR всегда одинаковы. Если пользователь потерял свой телефон и хочет удалить QR-код и получить новый QR-код, это невозможно. Лучше всего создавать случайные секреты и хранить их в хранилище.

person taraf    schedule 31.07.2019