Автентифікація за допомогою одноразових кодів базуються на проміжках часу є популярним способом, який використовуюється на багатьох сервісах. Інколи код може генеруватись за допомогою застосунка для браузера чи телефона, а інколи просто відправляється на електронну пошту, соціальну мережу чи за допомогою бота у сервісі чатів ( наприклад Telegram, Viber ). Особливістю може бути те, що користувач самостійно може вибрати який спосіб йому більше подобається. Після чого, він завжди зможе згенерувати потрібний 2FA код наприклад застосунком, а самому сервісу не потрібно буде нести затрати на відправку і обробку повідомлень на email (які інколи можуть не доходити вчасно і попадати в папку spam).
Я записував відео про те, як проходити 2FA програмою ZennoPoster, спочатку зчитуючи QR код, потім генеруючи потрібне значення.
В цьому відео мова йде про використання двух бібліотек, посилання на репозиторії приведу тут:
github.com/zxing/zxing github.com/glacasa/TwoStepsAuthenticator
Код, який зчитує QR код я вже розміщував у цій публікації. Але його можна інколи просто скопіювати на сайті в буфер обміну. В такому випадку, маючи секретне слово ми можемо прочитати його звідти використовуючи таку інструкцію:
string secret = System.Windows.Forms.Clipboard.GetText().Trim();
Тепер коли наша змінна містить секретне слово – можна виконати інструкції, які на його основі згенерують 2FA одноразовий код:
string code = string.Empty; try { var token = new TwoStepsAuthenticator.TimeAuthenticator(); code = token.GetCode(secret); } catch { code = string.Empty; } return code;
Одержавши згенерований код, його можна помістити в буфер обміну наприклад такою інструкцією:
System.Windows.Forms.Clipboard.SetText(code);
Остається тільки вставити 2FA в потрібному полі на потрібному сайті. Такий проєкт просто добавляємо собі в ZennoPoster, і запускаємо завжди коли потрібно одержати одноразовий код (перед виконанням в буфер обміну необхідно помістити секрет), і одноразовий код буде згенеровано і встановлено в буфер обміну.
Використовував я автоматизацію цього процесу колись для авторизації на криптовалютних біржах. Для входу в аккаунти в криптовалютні казіно, де роздавали бонуси за вхід (було колись таке 999dice). А зараз використовую для входу в онлайн кошелька на блокчейні WAX. Мені здається, що генерація таких тимчасових кодів автентифікації проєктом в ZennoPoster більш беспечне, ніж використання сторонніх застосунків, адже в такому випадку приходиться довіряти їм секретне слово, на основі якого генеруються потрібні коди. Власне самі застосунки можуть бути беспечними, просто зловмисники знають про них, і можуть знаходити способи як за допомогою вірусів одержати доступ до цих секретних даних.
Зараз, коли я знову повернувся до теми автентифікації, то чітко розумію, що з цілью безпеки, можна створити таблицю в MySQL, і на PHP написати простеньке API, документуючи його наприклад використовуючи Swagger. В табличці просто можна зберігати ідентифікатор акаунта і секретне слово. Після чого, відправляючи відомий ідентифікатор у відповідь одержувати готовий 2FA код. Перевага такого способу очевидна – секретне слово однозначно не буде передаватись по мережі більше ніж один раз (в момент добавлення в базу даних). А використовувати можна не тільки в ZennoPoster, але і створити можна для себе TelegramBot, через якого просто одержувати доступ до актуальних кодів 2FA.