Следует ли сохранять ключ учетной записи «Google Two Factor Authenticator» в моей базе данных?
Я пытаюсь понять, как работает процесс двухфакторной аутентификации Google , чтобы включить его на свой сайт. Насколько я понимаю, процесс состоит из двух частей.
- Пользователь на моем сайте включил двухфакторную аутентификацию, которая установила связь между моим пользователем и приложением. Это одноразовый шаг, который выполняется не при каждой попытке входа в систему.
- Каждый раз, когда пользователь входит в систему, ему нужно будет предоставить шестизначный код из приложения 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
что-то, что мне пришлось бы воссоздавать при каждой попытке входа в систему? Если этот код что-то я сохраню в своей базе данных, должен ли он быть зашифрован как пароль?
1 ответ
Когда я его настраиваю, я обычно:
Имейте столбец G2FAEnabled в базе данных и один для секретного ключа пользователя
Создайте уникальный секретный ключ и используйте его для генерации штрих-кода для страницы, на которой пользователь использует настроенную G2FA, запомните его на стороне сервера (поместите в базу данных), но не устанавливайте столбец Enable
Попросите пользователя отсканировать или ввести код, который показывает его устройство после добавления вашего сайта в аутентификатор. Это доказывает, что их устройство настроено правильно, часы их устройства верны и т. Д.
Если число, которое они вводят, верное, установите для столбца Enabled значение true и заблокируйте все, чтобы секретный ключ теперь нельзя было изменить (изменение его приведет к уничтожению их 2FA)
С этого момента пользователь должен указать правильный пин-код на основе времени для текущего времени сервера и секретный ключ, хранящийся на сервере. Часы их устройств должны оставаться синхронизированными с сервером. Вы можете добиться допустимости дрейфа часов, проверяя, например, 6 раз по обе стороны от текущего времени, пытаясь найти совпадение (это означает, что часы устройства могут быть плюс минус 3 минуты относительно времени сервера и все равно совпадать).
Любая попытка деактивировать 2FA (установить для столбца enabled значение false) также должна потребоваться действительный код 2FA, но альтернативный процесс для вашего отдела обслуживания клиентов (например, посмотрите паспорт пользователя) должен разрешить сброс, не зная об этом.
Вам не нужно шифровать секретный ключ в базе данных - вам придется расшифровать его, чтобы использовать его, и это не похоже на бестактность, такую как хранение паролей в виде открытого текста (что является проблемой, если ваша база данных украдена, потому что пользователи повторно используют пароли все время, поэтому кража вашей базы данных может означать, что вы раскрываете пароль пользователя для всех других служб), потому что это должны быть случайные данные, которые ничего не значат за пределами вашей организации, поэтому это не поможет хакеру проникнуть в другой из сайты пользователя, использующие одно и то же устройство 2FA.
Обычно, если кто-то доходит до возможности украсть вашу базу данных, он уже достигает точки, когда они могут украсть необходимые биты для расшифровки всего, что вы храните зашифрованным, но если вы уверены, что ваша база данных, вероятно, будет украдена, но ваш веб-сервер будет оставайтесь в безопасности, тогда обязательно зашифруйте данные db