Шпаргалки по безопасности: JWT / Хабр

Что такое nft и как на них можно заработать миллионы

Виды токенов

Токены можно разделить на 3 основные группы:

  1. Equity tokens – это токены, в ценность которых входят акции предприятий.

  2. Utility tokens. Тут как пример можно привести начисление каких-либо баллов за совершение определенных действий, которые начисляются в играх.

  3. Utility tokens – это токены на основе товаров или услуг.

Третий тип токенов наиболее обеспеченный, так как компании, которые предоставляют товары и услуги, или же отдельные лица, выступают гарантом совершения сделок. В данном случае один или несколько товаров (услуг) равняются одному токену. 

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

Зачем они нужны?

Если говорить попроще, главное предназначение токена –бартер неких ценностей, реализация которого в реальности осложнена расстоянием между сторонами сделок, размерами тех самых ценностей, участвующих в сделках.

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

Это заложено во всех ICO. Первоначально, когда его дальнейшая судьба неизвестна, ICO предлагает купить токены по низкой цене в качестве инвестора в конкретный проект, описывая, как он может принести прибыль в будущем. Если проект будет развиваться, цена токенов увеличится, если они связаны с активами проекта или применяются в бизнесе.

Читайте также:  Передача ЭЦП: доверенность другому лицу

Использование алгоритма хеширования none

Подобная атака происходит, когда злоумышленник изменяет токен, а также меняет алгоритм хеширования (поле “alg”), чтобы указать через ключевое слово none, что целостность токена уже проверена. Некоторые библиотеки рассматривали токены, подписанные с помощью алгоритма none, как действительный токен с проверенной подписью, поэтому злоумышленник мог изменить полезную нагрузку (payload) токена, и приложение доверяло бы токену.

Для предотвращения атаки необходимо использовать библиотеку JWT, которая не подвержена данной уязвимости. Также во время проверки валидности токена необходимо явно запросить использование ожидаемого алгоритма.

Пример реализации:

// Ключ HMAC хранится как String в памяти JVM
private transient byte[] keyHMAC = ...;

...

// Создание контекста верификации для запроса к токену
// Явно указывается использование HMAC-256 хеш-алгоритма
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC)).build();

// Верификация токена
DecodedJWT decodedToken = verifier.verify(token);

Использование слабого ключа при создании токена

Если секрет, используемый в случае алгоритма HMAC-SHA256, необходимый для подписи токена, является слабым, то он может быть взломан (подобран c помощью атаки грубой силы). В результате злоумышленник может подделать произвольный действительный токен с точки зрения подписи.

Для предотвращения этой проблемы надо использовать сложный секретный ключ: буквенно-цифровой (смешанный регистр) специальные символы.

Поскольку ключ необходим только для компьютерных вычислений, размер секретного ключа может превышать 50 позиций.

Например:

A&'/}Z57M(2hNg=;LE?~]YtRMS5(yZ<vcZTA3N-($>2j:ZeX-BGftaVk`)jKP~q?,jk)EMbgt*kW'

Для оценки сложности секретного ключа, используемого для вашей подписи токена, вы можете применить атаку по словарю паролей к токену в сочетании с JWT API.

Много нюансов

Сфера NFT — наиболее сложная для инвестиций из-за неочевидности внутренней стоимости активов, считает директор сервиса по обмену криптовалюты Alfacash Никита Сошников. Он рекомендовал не делать ставку на эту индустрию молодым и неопытным инвесторам, поскольку комфортно работать с NFT не всегда могут даже профессионалы.

При выборе NFT-токенов для спекуляций или долгосрочных инвестиций эксперт рекомендовал руководствоваться репутацией эмитента актива. Например, если это известный баскетбольный или футбольный клуб, то шансов на рост или хотя бы отсутствие резкого обвала будет больше, пояснил Сошников.

«Помимо репутации проекта, эмитирующего NFT, следует еще смотреть на ликвидность токенов на вторичном рынке. На первичном рынке спросом легко манипулировать, а на вторичном проявляется истинный спрос на эти активы», — добавил эксперт.

Отличие токенов от монет

Токены отличаются от монет тем, как они выпускаются. Если монеты децентрализованы, они выпускаются разными компьютерами, то выпуском токенов занимается руководство одной или нескольких организаций, или же какое-либо конкретное лицо. Бывают и исключения, но чаще всего все транзакции, связанные с токенами, полностью подконтрольны, поскольку транзакции часто порождают обязательства.

Вторым существенным отличием является их стоимость, а именно факторы, которые ее определяют. Допустим, если стоимость Bitcoin напрямую зависит от спроса и предложения, то стоимость токена определяется, вложенным в него активом.

Перехват токенов

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

Защита заключается в добавлении «пользовательского контекста» в токен. Пользовательский контекст будет состоять из следующей информации:

Покупка токенов и их хранение

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

Хранение токенов осуществляется с помощью специальных электронных кошельков, на которых происходит хранение и обработка ключей, а формирование транзакций.

Но тут никак без рисков и проблем, связанных с:

Работа с искусством

Поскольку технология невзаимозаменяемых токенов уже широко применяется в искусстве, то для поиска перспективных вложений необходимо использовать ресурсы, где представлены стоящие работы, уверена продакт-менеджер компании Erachain Елена Буйдалина. По ее мнению, искать произведения искусства можно на маркетплейсах Foundation, MakersPlace, Snark.art. Urban Files и других.

Читайте также:  Плагин недоступен. Авторизация по сертификату невозможна в Госуслугах

«Для этого придется начать изучать арт-рынок в целом, не только криптохудожников. Например, следить за Марко Мельграти, Эмануэлем Дасканио, Андреем Бергером, Еленой Шейдлиной», — пояснила эксперт.

Желающим торговать NFT в сфере искусства Буйдалина посоветовала разыскать в социальных сетях художников, принимающих участие в фестивале Art Life, и подписаться на их обновления, чтобы первым получать новости о выходе новых работ.

При перепродаже NFT-токенов имя автора играет очень большую роль, отметила Буйдалина. По ее словам, даже на вторичном рынке NFT от известного художника с высокой вероятностью будет куплена в кратчайшие сроки, в отличие от арта случайного автора, продавать который можно месяцами.

Работа с NFT в сфере искусства мало чем отличается от обычного искусства, утверждает генеральный директор швейцарской финансовой компании Newcent Владимир Сметанин. По его мнению, лучшей стратегией работы на этом рынке для непрофессиональных коллекционеров является покупка работы, которая нравится именно вам.

Развитие индустрии

Сейчас индустрия NFT только формируется, подчеркивает Сошников, и для этого этапа большое количество «мусорных» проектов — это нормально. Со временем такие проекты сами уйдут с рынка и отрасль станет более стабильной и предсказуемой, считает эксперт.

«Настоящий бум NFT еще впереди», — спрогнозировал Сошников.

— Сеть кинотеатров AMC изучит возможность принимать платежи в Shiba Inu

— Курс биткоина впервые в истории поднялся выше $68 тыс.

— Мечта о быстрой и большой прибыли. В чем феномен мемных криптовалют

Больше новостей о криптовалютах вы найдете в нашем телеграм-канале РБК-Крипто.

Раскрытие информации о токене

Эта атака происходит, когда злоумышленник получает доступ к токену (или к набору токенов) и извлекает сохраненную в нем информацию (информация о токене JWT кодируется с помощью base64) для получения информации о системе. Информация может быть, например, такой как, роли безопасности, формат входа в систему и т.д.

Способ защиты достаточно очевиден и заключается в шифровании токена. Также важно защитить зашифрованные данные от атак с использованием криптоанализа. Для достижения всех этих целей используется алгоритм AES-GCM, который обеспечивает аутентифицированное шифрование с ассоциированными данными (Authenticated Encryption with Associated Data – AEAD).

Примитив AEAD обеспечивает функциональность симметричного аутентифицированного шифрования. Реализации этого примитива защищены от адаптивных атак на основе подобранного шифртекста. При шифровании открытого текста можно дополнительно указать связанные данные, которые должны быть аутентифицированы, но не зашифрованы.

То есть шифрование с соответствующими данными обеспечивает подлинность и целостность данных, но не их секретность.

Однако необходимо отметить, что шифрование добавляется в основном для сокрытия внутренней информации, но очень важно помнить, что первоначальной защитой от подделки токена JWT является подпись, поэтому подпись токена и ее проверка должны быть всегда использованы.

Соображения по поводу использования jwt

Даже если токен JWT прост в использовании и позволяет предоставлять сервисы (в основном REST) без сохранения состояния (stateless), такое решение подходит не для всех приложений, потому что оно поставляется с некоторыми оговорками, как, например, вопрос хранения токена.

Если приложение не должно быть полностью stateless, то можно рассмотреть возможность использования традиционной системы сессий, предоставляемой всеми веб-платформами. Однако для stateless приложений JWT – это хороший вариант, если он правильно реализован.

Хранение токенов на стороне клиента

Если приложение хранит токен так, что возникает одна или несколько из следующих ситуаций:

Для предотвращения атаки:

  1. Хранить токен в браузере, используя контейнер sessionStorage.
  2. Добавить его в заголовок Authorization, используя схему Bearer. Заголовок должен выглядеть следующим образом:
    Authorization: Bearer <token>
  3. Добавить fingerprint информацию к токену.
Читайте также:  Пароль к сертификату ЭП: общие понятия, правила использования кода, способы восстановления

Сохраняя токен в контейнере sessionStorage, он предоставляет токен для кражи в случае XSS. Однако fingerprint, добавленный в токен, предотвращает повторное использование украденного токена злоумышленником на его компьютере. Чтобы закрыть максимум областей использования для злоумышленника, добавьте Политику безопасности содержимого браузера (Content Security Policy), чтобы ограничить контекст выполнения.

Остается случай, когда злоумышленник использует контекст просмотра пользователя в качестве прокси-сервера, чтобы использовать целевое приложение через легитимного пользователя, но Content Security Policy может предотвратить связь с непредвиденными доменами.

Также возможно реализовать службу аутентификации таким образом, чтобы токен выдавался внутри защищенного файла cookie, но в этом случае должна быть реализована защита от CSRF.

Явное аннулирование токена пользователем

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

Одним из способов защиты является внедрение черного списка токенов, который будет пригоден для имитации функции «выход из системы», существующей в традиционной системе сеансов.

В черном списке будет храниться сборник (в кодировке SHA-256 в HEX) токена с датой аннулирования, которая должна превышать срок действия выданного токена.

Когда пользователь хочет «выйти», он вызывает специальную службу, которая добавляет предоставленный токен пользователя в черный список, что приводит к немедленному аннулированию токена для дальнейшего использования в приложении.

Пример реализации:

Хранилище черного списка:Для централизованного хранения черного списка будет использоваться база данных со следующей структурой:

create table if not exists revoked_token(jwt_token_digest varchar(255) primary key,
revokation_date timestamp default now());

Управление аннулированиями токенов:

// Контролирование отката токена (logout).
// Используйте БД, чтобы разрешить нескольким экземплярам проверять
// отозванный токен и разрешить очистку на уровне централизованной БД.
public class TokenRevoker {

 // Подключение к БД
 @Resource("jdbc/storeDS")
 private DataSource storeDS;

 // Проверка является ли токен отозванным
 public boolean isTokenRevoked(String jwtInHex) throws Exception {
     boolean tokenIsPresent = false;
     if (jwtInHex != null && !jwtInHex.trim().isEmpty()) {
         // Декодирование токена
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);

         // Вычисление SHA256 от токена
         MessageDigest digest = MessageDigest.getInstance("SHA-256");
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);

         // Поиск токена в БД
         try (Connection con = this.storeDS.getConnection()) {
             String query = "select jwt_token_digest from revoked_token where jwt_token_digest = ?";
             try (PreparedStatement pStatement = con.prepareStatement(query)) {
                 pStatement.setString(1, jwtTokenDigestInHex);
                 try (ResultSet rSet = pStatement.executeQuery()) {
                     tokenIsPresent = rSet.next();
                 }
             }
         }
     }

     return tokenIsPresent;
 }

// Добавление закодированного в HEX токена в таблица отозванных токенов
public void revokeToken(String jwtInHex) throws Exception {
     if (jwtInHex != null && !jwtInHex.trim().isEmpty()) {
         // Декодирование токена
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);

         // Вычисление SHA256 от токена
         MessageDigest digest = MessageDigest.getInstance("SHA-256");
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);

         // Проверка на наличие токена уже в БД и занесение в БД в
	   // обратном случае
         if (!this.isTokenRevoked(jwtInHex)) {
             try (Connection con = this.storeDS.getConnection()) {
                 String query = "insert into revoked_token(jwt_token_digest) values(?)";
                 int insertedRecordCount;
                 try (PreparedStatement pStatement = con.prepareStatement(query)) {
                     pStatement.setString(1, jwtTokenDigestInHex);
                     insertedRecordCount = pStatement.executeUpdate();
                 }
                 if (insertedRecordCount != 1) {
                     throw new IllegalStateException("Number of inserted record is invalid,"   " 1 expected but is "   insertedRecordCount);
                 }
             }
         }

     }
 }

Вывод

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector