Должен ли секретный ключ учетной записи Google Two Factor Authenticator храниться в моей базе данных?

Я пытаюсь понять, как работает процесс Двухфакторная аутентификация Google, чтобы внедрить его на свой сайт. Насколько я понимаю, в этом процессе есть две разные части

  1. Пользователь на моем сайте включил двухфакторную аутентификацию, которая создала связь между моим пользователем и приложением. Это одноразовый шаг и не происходит при каждой попытке входа в систему.
  2. Каждый раз, когда пользователь входит в систему, ему нужно будет предоставить шестизначный код из приложения Google Authenticator.

Теперь следующий код сгенерирует QR-изображение и код установки, чтобы включить 2FA и связать учетную запись с Google Authenticate.

TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
string accountSecretKey = Guid.NewGuid();
var setupInfo = tfa.GenerateSetupCode("Dotnet Awesome", login.Username, accountSecretKey, 300, 300);
ViewBag.BarcodeImageUrl = setupInfo.QrCodeSetupImageUrl;
ViewBag.SetupCode = setupInfo.ManualEntryKey;

Теперь при каждом запросе я бы аутентифицировал пользователя, используя следующий код

TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
tfa.ValidateTwoFactorPIN(accountSecretKey, "Six Digit Code");

Вопрос

В приведенном выше коде будет ли код accountSecretKey что-то, что мне нужно будет сохранить в моей базе данных, чтобы я мог передавать его каждый раз, когда я хочу проверить? Или accountSecretKey что-то, что мне придется создавать заново при каждой попытке входа в систему? Если этот код я буду хранить в своей базе данных, должен ли он также быть зашифрован как пароль?




Ответы (1)


Когда я его устанавливаю, я обычно:

Иметь столбец G2FAEnabled в базе данных и один для пользовательского SecretKey.

Сгенерируйте уникальный секретный ключ и используйте его для создания штрих-кода для страницы, которую пользователь использует для настройки G2FA, запомните его на стороне сервера (поместите его в БД), но не устанавливайте включенный столбец

Попросите пользователя отсканировать или ввести код, который показывает его устройство после добавления вашего сайта в аутентификатор. Это доказывает, что их устройство настроено правильно, часы устройства правильные и т. д.

Если номер, который они вводят, правильный, установите для включенного столбца значение true и заблокируйте все, чтобы секретный ключ теперь нельзя было изменить (изменение его убьет их 2FA)

С этого момента пользователь должен указать правильный PIN-код, основанный на времени, для текущего времени сервера и секретный ключ, хранящийся на сервере. Часы их устройства должны оставаться синхронизированными с сервером. Вы можете добиться устойчивости к дрейфу часов, проверив, например, 6 раз каждую сторону от текущего времени, пытаясь найти совпадение (это означает, что часы устройства могут быть плюс-минус 3 минуты относительно времени сервера и все еще совпадать).

Любая попытка деактивировать 2FA (установить для столбца «включено» значение «false») также должна требовать действительного кода 2FA, но альтернативный процесс для вашего отдела обслуживания клиентов (например, просмотр паспорта пользователя) должен разрешать сброс, не зная об этом.

Вам не нужно шифровать секретный ключ в базе данных — вам придется расшифровать его, чтобы использовать его, и это не похоже на оплошность, такую ​​​​как хранение паролей в виде открытого текста (что является проблемой, если ваша база данных украдена, потому что пользователи повторно используют пароли все время, поэтому кража вашей базы данных может означать, что вы раскрываете пароль пользователя для всех других их служб), потому что это должны быть случайные данные, которые ничего не значат за пределами вашей организации, поэтому это не поможет хакеру взломать другой из сайты пользователя, использующие одно и то же устройство 2FA.

Обычно, если кто-то доходит до того, что может украсть вашу базу данных, он уже достиг точки, когда он может украсть необходимые биты для расшифровки всего, что вы храните в зашифрованном виде, но если вы уверены, что ваша база данных может быть украдена, но ваш веб-сервер оставаться в безопасности, а затем всеми средствами зашифровать данные БД

person Caius Jard    schedule 22.02.2021