Не сканируется qr код nicehash
Двухфакторная аутентификация сегодня повсюду. Благодаря ей, чтобы украсть аккаунт, недостаточно одного лишь пароля. И хотя ее наличие не гарантирует, что ваш аккаунт не уведут, чтобы ее обойти, потребуется более сложная и многоуровневая атака. Как известно, чем сложнее что-либо в этом мире, тем больше вероятность, что работать оно не будет.
Уверен, все, кто читают эту статью, хотя бы раз использовали двухфакторную аутентификацию (далее — 2FA, уж больное длинное словосочетание) в своей жизни. Сегодня я приглашаю вас разобраться, как устроена эта технология, ежедневно защищающая бесчисленное количество аккаунтов.
Но для начала, можете взглянуть на демо того, чем мы сегодня займемся.
Установка Google Authenticator
Открываем приложение Google Authenticator, вас будет приветствовать мастер настройки, можно сразу нажать кнопку "Начать"
У вас будет два метода добавить сюда нужный аккаунт из сервисов, QR-код и просто ключ, я выберу QR-код, который вам уже предоставил HitBTC.
У вас будет запрошено разрешение на использование камеры, разрешаем.
Вводим 6-ти значный ключ из Google Authenticator в поле "Enter validation code from your device"
Вас уведомят, что для активации двухфакторной аутентификации 2FA на HitBTC вы должны подтвердить письмо. Делаем это.
У вас будет вот такое письмо. Переходим по ссылке и активируем 2FA вход.
Теперь у вас в пункте Two-Factor Authentication будут перечислены все ваши аккаунты из Google Authenticator. Теперь ваш аккаунт на HitBTC надежно защищен.
Обратите внимание, что на данной вкладке вы так же можете изучить историю входа с географией и IP-адресами.
Включение 2FA на HitBTC
Следующим шагом, который раз и навсегда защитит ваш аккаунт, это включение двухфакторной аутентификации. Ранее я уже рассказывал, как это делать на других биржах:
Еще советую вам почитать про принципы работы двухфакторной аутентификации, думаю будет полезно.Находясь на той же вкладке "Security" найдите раздел Two-Factor Authentication. Перед вами будет ваш QR-код с вашим секретным ключом, ниже будет сам Secure private key. Вы должны все это дело сфотографировать, записать и убрать в надежное место, так как эти данные будут нужны в случае утери телефона и восстановления доступа к аккаунту. Тут алгоритм такой же, как и в других случаях. Вам на телефон нужно установить приложение Google Authenticator, чтобы через него получать временные коды. Сделаем это.
Основы
Первое, что стоит упомянуть про одноразовые пароли, — это то, что они бывают двух типов: HOTP и TOTP. А именно, HMAC-based One Time Password и Time-based OTP. TOTP — это лишь надстройка над HOTP, поэтому сначала поговорим о более простом алгоритме.
HOTP описан спецификацией RFC4226. Она небольшая, всего 35 страниц, и содержит все необходимое: формальное описание, пример реализации и тестовые данные. Давайте рассмотрим основные понятия.
Если вы сейчас думаете про себя, какое отношение все это имеет к одноразовым паролям — не волнуйтесь, мы почти дошли до самого главного.
Согласно спецификации, HOTP вычисляется на основе двух значений:
- K — секретный ключ, который знают клиент и сервер. Он должен быть минимум 128 бит длиной, а лучше 160, и создается когда, вы настраиваете 2FA.
- C — счетчик.
Итак. Как вы, наверное, заметили, HMAC тоже принимает два аргумента. RFC4226 определяет функцию генерации HOTP следующим образом:
Давайте начнем писать код и разберемся с остальным по ходу дела.
Тестирование
Для того чтобы протестировать реализацию, воспользуемся примерами из RFC. Приложение D включает в себя тестовые значения для секретного ключа "12345678901234567890" и значений счетчика от 0 до 9. Также там есть подсчитанные хэши HMAC и промежуточные результаты функции Truncate. Довольно полезно для отладки всех шагов алгоритма. Вот небольшой пример этой таблицы (оставлены только счетчик и HOTP):
Если вы еще не смотрели демо, сейчас самое время. Можете повбивать в нем значения из RFC. И возвращайтесь, потому что мы приступаем к TOTP.
Вот мы, наконец, и добрались до более современной части 2FA. Когда вы открываете свой генератор одноразовых паролей и видите маленький таймер, отсчитывающий, сколько еще будет валиден код, — это TOTP. В чем разница?
Time-based означает, что вместо статического значения, в качестве счетчика используется текущее время. Или, если точнее, "интервал" (time step). Или даже номер текущего интервала. Чтобы вычислить его, мы берем Unix-время (количество миллисекунд с полуночи 1 января 1970 года по UTC) и делим на окно валидности пароля (обычно 30 секунд). Сервер обычно допускает небольшие отклонения ввиду несовершенства синхронизации часов. Обычно на 1 интервал вперед и назад в зависимости от конфигурации.
Очевидно, это гораздо безопаснее, чем схема HOTP. В схеме, завязанной на время, валидный код меняется каждые 30 секунд, даже если он не был использован. В оригинальном алгоритме валидный пароль определен текущим значением счетчика на сервере + окном допуска. Если вы не аутентифицируетесь, пароль не будет изменен бесконечно долго. Больше про TOTP можно почитать в RFC6238.
Поскольку схема с использованием времени — это дополнение к оригинальному алгоритму, нам не потребуется вносить изменения к изначальной реализации. Мы воспользуемся requestAnimationFrame и будем на каждый фрейм проверять, до сих пор ли мы находимся внутри временного интервала. Если нет — генерируем новый счетчик и вычисляем HOTP заново. Опуская весь управляющий код, решение выглядит как-то так:
Удаление API ключей
API ключи позволяют удаленно управлять вашими активами из других сервисов и приложений, поэтому нужно проверить, что их нет и если есть, то удалить. Переходим на вкладку API Keys и проверяем список, в моем случае их не было.
Установка Google Authenticator
Открываем приложение Google Authenticator, вас будет приветствовать мастер настройки, можно сразу нажать кнопку "Начать"
У вас будет два метода добавить сюда нужный аккаунт из сервисов, QR-код и просто ключ, я выберу QR-код, который вам уже предоставил Poloniex.
У вас будет запрошено разрешение на использование камеры, разрешаем.
ОБЯЗАТЕЛЬНО СОХРАНИТЕ СЕБЕ резервную копию ключа из 16 символов (16-Digit Key) и сфотографируйте сам QR-код. У вас будет добавлен аккаунт в Google Authenticator, где каждые 30 секунд будет генерироваться новый, временный код доступа.
Теперь, когда вы будите авторизовываться на бирже, у вас появится дополнительное поле "Аутентификационный код (изGoogle Authenticator)". Вводим его и заходим на биржу.
Как видите все прекрасно и быстро работает, всегда старайтесь, делать двойную защиту на любых сервисах, тем более это занимает не более двух-трех минут, будьте здравомыслящими.
This email is to notify you of a successful login to your HitBTC account from an IP address not previously associated with this account.
Date: | 2019.05.19 23:37 |
Location: | , Russia |
Event: | Sign-in |
Device: | desktop |
Browser: | Chrome 69.0 |
Operation system: | WinNT |
IP: | 178.57.67.167 |
If you do not recognize this login, you should terminate all sessions, change password and delete all API keys immediately. Make sure you have 2FA enabled on your account. It can protect your account, even if someone obtains your login and password.
Из письма я видел, что некто по IP адресу 178.57.67.167 из Калуги, с компьютера хотел поиметь мои криптоденежки, но обломался. Тут представители HitBTC любезно вам сообщают, что нужно сделать в первую очередь если это были не вы:
- Убить все текущие сессии
- Удалить все API ключи
- Включить двухфакторную аутентификацию
Прежде чем убивать все сессии, убедитесь, что это не фишинговое письмо, которое содержит ссылку на левый сайт. Убедитесь, что в поле отправитель стоит проверенный адрес имеющий зеленую лычку, домена того сервиса, что был взломан.За это отвечают технологии DKIM и SPF, которые проверяют цифровую подпись отправителя. В моем примере Яндекс удостоверился и подтвердил, что письмо пришло с сервера HitBTC.
Первым делом нажимаем "Terminate all session". В результате все сессии будут завершены. Далее авторизовываемся на сайте hitbtc.com. После чего я вам еще раз советую сразу же поменять пароль на вход. Для этого в правом верхнем углу нажмите значок шестеренки, у вас откроется настройки профиля. После чего перейдите на вкладку "Security". В поле "old Password" введите старый пароли и два раза новый.
На почту вам придет уведомление, что пароль на вход был изменен.
Как в итоге взломали
Могу со сто процентной уверенностью сказать, что ломанули саму биржу HitBTC. По одной причине, что у меня вирусов на компьютере нет, во вторых у меня стойкий пароль из 22 символов, плюс это не первая уже ситуация ,не только у меня, когда у людей приходили такие письма счастья. Так же вам советую верифицировать ваш аккаунт, удостоверив вашу личность, это как я делал верификацию для Poloniex, хуже от этого не будет. Теперь когда в очередной раз хакеры попытаются взломать аккаунт HitBTC, и попытаются войти, то они увидят
На этом у меня все. С вами был Сео Мастер, автор и создатель портала Pyatilistnik.info.
Доброго времени суток.
Я хотел бы рассказать вам о проблемах 2FA аутентификации на устройствах Android 4.4.2 KitKat и о решении, которое в нашем случае прекратило долгие поиски.
Некоторое время назад мы с коллегами решили добавить Двухэтапную аутентификацию (Two factor authentication или для краткости 2FA) для нашего маленького офисного сервера на базе Ubuntu Server.
2FA это дополнительный уровень безопасности и приятное дополнение к уже существующему механизму аутентификации. Кроме обычной пары логин + пароль от пользователя, выполняющего авторизацию, требуется цифровой ключ, который динамически изменяется каждые 30 секунд и генерируется устройством, находящимся во владении пользователя. Для генерации ключа мы использовали Приложение Google authenticator и мобильный телефон на платформе Android. После разовой настройки приложение генерирует коды, имеющие срок жизни в 30 секунд, точно такие же коды генерирует сервер. При аутентификации коды сравниваются.
Так как данные не передаются от сервера и хранятся только на устройстве — этот механизм является более безопасным, чем отправка кодов подтверждения (например, как 3D-secure SMS подтверждение в банковских системах).
Пошаговых инструкций о настройках сервера в сети оказалось неожиданно много. В них все очень просто и доходчиво. Я руководствовался этой статьей.
После настроек сервера установили на телефон Lenovo p780 приложение Google Authenticator, «прочитали» телефоном с монитора QR-code и получили заветные циферки для авторизации. Перед тем как перезагрузить SSH не забывайте сохранить резервные ключи для восстановления доступа.
И вот, все готово к использованию! Перезагружаем SSH, заходим на сервер, указываем пароль, после пароля нас просят предъявить Verification code, переписываем его с телефона и… снова просят указать пароль. Выглядит это так:
Вначале думали, что ошибка допущена в настройках, но испробовав несколько мобильных устройств стало очевидно, что коды генерируемые на Android 4.4.2 KitKat приложением Google Authenticator всегда ошибочны.
Инсталляция Google Authenticator
Открываем приложение Google Authenticator, вас будет приветствовать мастер настройки, можно сразу нажать кнопку "Начать"
У вас будет запрошено разрешение на использование камеры, разрешаем.
Считываем QR-код представленный на окне включения 2FA аутентификации на Nicehash.com. ОБЯЗАТЕЛЬНО СОХРАНИТЕ СЕБЕ резервную копию ключа из 16 символов (16-Digit Key) и сфотографируйте сам QR-код. Теперь когда приложение у вас на телефоне, можно включать двухфакторную защиту аккаунта. Я выбираю для начала "2FA для входа на сайт". После нажатия кнопки "Включить" у вас появится QR-код с секретным ключом, ниже он будет представлен в виде 16 символов, его нужно себе записать или сфотографировать, не передавайте его третьим лицам, данный код будет использоваться при восстановлении доступа к личному кабинету найсхеша.
Далее вы открываете утилиту Google Authenticator, нам нужно добавить здесь новый аккаунт, для этого нажмите в правом углу красную кнопку с крестиком.
У вас на выбор будет два варианта:
- Самый быстрый это отсканировать QR-код
- Ввести 16-ти значный ключ в ручную
Теперь когда у нас есть Google Authenticator, мы можем включать 2FA на найсхеше. Далее вы возвращаетесь в мастер настройки 2FA для входа на сайт и указываете ваш 16-ти значный код, который вы получили на первой картинке и нажимаете далее.
Далее вас попросят ввести 6-ти значный ключ полученный из Google Authenticator
Если все хорошо, то вы увидите активную кнопку "Включить"
После этого у вас будет активирован пункт "2FA для входа на сайт Nicehash.com"
Аналогичным образом вы делаете для остальных пунктов.
Переходим в настройки вашего аккаунта.
В настройках, прямо сразу вверху, вас уведомят, что было бы здорово, включить двухфакторную аутентификация, через Google Authenticator. Обязательно сохраните секретный ключ, для восстановления аккаунта, если вы потеряете доступ к Two-Factor Authentication. Чтобы все включить, вам нужно установить Google Authenticator и отсканировать QR-код.
Заключение
И на этом все! Еще раз, не забывайте посмотреть демо. Там же есть ссылка на репозиторий с кодом, который за этим всем стоит.
Сегодня мы разобрали достаточно важную технологию, которой пользуемся на ежедневной основе. Надеюсь, вы узнали для себя что-то новое. Эта статья заняла гораздо больше времени, чем я думал. Однако довольно интересно превратить бумажную спецификацию в нечто работающее и такое знакомое.
Любой современный сервис, который радеет за безопасность ваших данных, средств и свою репутацию, давно реализовал у себя возможность подключения двухфакторной аутентификации 2FA, о ее принципах читайте подробнее по ссылке слева. Если вы мой постоянный читатель, то помните, что мы уже ее использовали на различных биржах:
Давайте начинать. На всю настройку двойной защиты аккаунта на Nicehash у нас уйдет минута-полторы. Производите авторизацию в вашем аккаунте, для этого в правом углу нажмите кнопку входа.
Ваш ip-адрес будет проверен на ddos атаку сервисом Cloudflare, если все хорошо, то вы в течении 5 секунд будите допущены до формы авторизации.
Логинитесь, вводя ваш логин и пароль.
Вы попадаете в личный кабинет найсхеш, в самом верху вы увидите уведомление, что для усиления защиты аккаунта, хорошо бы установить 2FA, щелкаем по этой ссылке.
Попав в раздел по настройке безопасности у вас будет три варианта включения двухфакторной аутентификации:
- 2FA для входа на сайт
- 2FA для покупки
- 2FA для вывода средств
На против каждого пункта вы увидите зеленую кнопку "Включить", которая позволит произвести активацию данной возможности.
Перед тем как мы включим данные пункты, вам необходимо установить себе на телефон Google Authenticator, это специальная бесплатная утилита от компании Google, которая позволяет вам генерировать временные коды доступа.
Последние штрихи — поддержка QR-кодов
Обычно, когда мы настраиваем 2FA, мы сканируем начальные параметры с QR-кода. Он содержит всю необходимую информацию: выбранную схему, секретный ключ, имя аккаунта, имя провайдера, количество цифр в пароле.
В предыдущей статье я рассказывал, как можно сканировать QR-коды прямо с экрана, используя API getDisplayMedia . На основе того материала я сделал маленькую библиотеку, которой мы сейчас и воспользуемся. Библиотека называется stream-display, и в дополнение к ней мы используем замечательный пакет jsQR.
Закодированная в QR-код ссылка имеет следующий формат:
Я опущу код, который настраивает процесс запуска захвата экрана и распознавания, так как все это можно найти в документации. Вместо этого, вот как можно распарсить эту ссылку:
В реальном мире секретный ключ будет закодированной в base-32 (!) строкой, поскольку некоторые байты могут быть непечатными. Но для простоты демонстрации мы опустим этот момент. К сожалению, я не смог найти информации, почему именно base-32 или именно такой формат. По всей видимости, никакой официальной спецификации к этому формату URL не существует, а сам формат был придуман Google. Немного о нем вы можете почитать здесь
Для генерации тестовых QR-кодов рекомендую воспользоваться FreeOTP.
Финальное решение проблемы: FreeOTP
За время поиска решения в сети я уже натыкался на GitHub приложения Google Authenticator, в трекинге ошибок есть наша, и в качестве решения предложено:
«You can used FreeOTP Authenticator(by Red Hat) instead of Google Authenticator until someone fix it.»
Долгое время мне казалось, что рекомендуется использовать другой механизм-аутентификатор, который нужно ставить на сервер вместо Google, поэтому я усердно искал другие решения. Хотелось заставить работать именно Google authenticator, но на самом же деле рекомендуют использовать другое приложение для Android, а серверная часть остается без изменений.
Приложение FreeOTP Authenticator от компании Red Hat. После настройки по тому же QR-коду все начало работать без необходимости что то корректировать.
К сожалению я не могу указать вам причину возникновения ошибки в приложении Google authenticator, но надеюсь, что мой печальный опыт поможет сэкономить чье-то время.
План реализации
Чтобы заполучить одноразовые пароли, нам понадобится выполнить следующие шаги.
- Сгенерировать HMAC-SHA1 хэш из параметров K и C. Это будет 20-байтовая строка.
- Вытащить 4 байта из этой строки определенным образом.
- Сконвертировать вытащенное значение в число и поделить его на 10^n, где n = количество цифр в одноразовом пароле (обычно n = 6). Ну и, наконец, взять остаток от этого деления. Это и будет наш пароль.
Звучит не слишком сложно, правда? Начнем с генерации хэша.
Генерируем HMAC-SHA1
К счастью, в Firefox вы можете использовать Web Crypto в незащищенном контексте, и изобретать колесо или приплетать сторонние библиотеки не придется. Поэтому для целей разработки демо предлагаю воспользоваться FF.
Само по себе Crypto API определено в window.crypto.subtle . Если вас удивляет название, привожу цитату из спецификации:
API носит название SubtleCrypto как отражение того, что многие из алгоритмов имеют специфические требования к использованию. Только при соблюдении этих требований они сохраняют свою стойкость .
Быстро пройдемся по методам, которые нам понадобятся. На заметку: все упомянутые здесь методы асинхронны и возвращают Promise .
Для начала нам понадобится метод importKey , поскольку мы будем использовать свой секретный ключ, а не генерировать его в браузере. importKey принимает 5 аргументов:
- format будет 'raw' , т.е. ключ мы предоставим в виде байт-массива ArrayBuffer .
- keyData — это тот самый ArrayBuffer. Совсем скоро поговорим о том, как именно его генерировать.
- algorithm , согласно спецификации, будет HMAC-SHA1 . Этот аргумент должен соответствовать формату HmacImportParams.
- extractable выставим в false, поскольку планов экспортировать секретный ключ у нас нет
- И, наконец, из всех usages нам понадобится только 'sign' .
Наш секретный ключ будет длинной случайной строкой. В реальном мире это может быть последовательность байтов, которые могут быть непечатными, однако для удобства в этой статье мы будем рассматривать строку. Для конвертации ее в ArrayBuffer мы воспользуемся интерфейсом TextEncoder . С его помощью ключ подготавливается в две строчки кода:
Теперь соберем все вместе:
Согласно спецификации, наш счетчик должен иметь длину 8 байт. Мы будем работать с ним опять же, как с ArrayBuffer . Для перевода его в эту форму мы воспользуемся трюком, который обычно используется в JS, чтобы сохранить нули в старших разрядах числа. После этого каждый байт мы поместим в ArrayBuffer , используя DataView . Имейте в виду, что по спецификации для всех бинарных данных подразумевается формат big endian.
Наконец, подготовив ключ и счетчик, можно генерировать хэш! Для этого мы воспользуемся функцией sign из SubtleCrypto .
И на этом мы завершили первый шаг. На выходе мы получаем немного загадочно называющееся значение HS. И хотя это не самое лучшее название для переменной, именно так она (и некоторые последующие) называются в спецификации. Оставим эти названия, чтобы проще было сравнивать с ней код. Что дальше?
Step 2: Generate a 4-byte string (Dynamic Truncation)
Let Sbits = DT(HS) // DT, defined below,
// returns a 31-bit string
DT расшифровывается как Dynamic Truncation. И вот как она работает:
Заметьте, как мы применили побитовое И к первому байту HS. 0x7f в двоичной системе — 0b01111111 , поэтому по сути мы просто отбрасываем первый бит. В JS на этом смысл данного выражения и заканчивается, но в других языках это также обеспечит отрезание знакового бита, чтобы убрать путаницу между положительными/отрицательными числами и представлять это число как беззнаковое.
Почти закончили! Осталось лишь сконвертировать полученное от DT значение в число и вперед, к третьему шагу.
Код для заключительной функции, которая объединяет все предыдущие, в таком случае будет выглядеть как-то так:
Ура! Но как теперь проверить, что наш код верный?
«Решения», которые удалось найти и их результаты:
- Если откатить версию Android, начинает работать корректно. (с этим «решением» работали какое то время, но решили двигаться дальше)
- Так как проблема сводится к некорректным часовым поясам — многие решения направлены именно на их исправление. Приложение TimeZone Fixer действительно может помочь с этой проблемой, однако часть приложений после его использования начинает отображать ошибочное время и потребуется чинить их вручную. (решение имеет свои минусы и риски. вся информация о приложении доступна на сайте 4pda)
- Подгонять время вручную. Если честно этот способ у нас так и не заработал. Перевести часы вручную и тем самым синхронизировать время на телефоне и сервере. Увы, все попытки ничего не дали, хотя были люди утверждающие, что у них заработало. В любом случае перспектива потерять функцию часов в телефоне не самая приятная.
- Синхронизация часов внутри настроек приложения Google authenticator (в нашем случае без результатов, однако были комментарии, что кому то помогло)
Читайте также: