Skip to content

Instantly share code, notes, and snippets.

@ruslansalikhov
Last active July 3, 2018 07:48
Show Gist options
  • Save ruslansalikhov/3df3bd3afd53d2d307d8e7a4b12a4ea6 to your computer and use it in GitHub Desktop.
Save ruslansalikhov/3df3bd3afd53d2d307d8e7a4b12a4ea6 to your computer and use it in GitHub Desktop.
XZEN Avatar Auth

Аутентификация в XZEN User Data Storage

Аккаунт XZEN

Пользователь XZEN это аккаунт зарегистрированный в блокчейне XZEN.

Пример данных в бч.

{
 "id": "1.2.17",
 "membership_expiration_date": "1969-12-31T23:59:59",
 "registrar": "1.2.17",
 "referrer": "1.2.17",
 "lifetime_referrer": "1.2.17",
 "network_fee_percentage": 2000,
 "lifetime_referrer_fee_percentage": 8000,
 "referrer_rewards_percentage": 0,
 "name": "nathan",
 "owner": {
   "weight_threshold": 1,
   "account_auths": [],
   "key_auths": [[
       "XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
       1
     ]
   ],
   "address_auths": []
 },
 "active": {
   "weight_threshold": 1,
   "account_auths": [],
   "key_auths": [[
       "XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
       1
     ]
   ],
   "address_auths": []
 },
 "options": {
   "memo_key": "XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
   "voting_account": "1.2.5",
   "num_witness": 0,
   "num_committee": 0,
   "votes": [],
   "extensions": []
 },
 "statistics": "2.6.17",
 "whitelisting_accounts": [],
 "blacklisting_accounts": [],
 "whitelisted_accounts": [],
 "blacklisted_accounts": [],
 "cashback_vb": "1.13.8",
 "owner_special_authority": [
   0,{}
 ],
 "active_special_authority": [
   0,{}
 ],
 "top_n_control_flags": 0
}
Параметр Описание
id идентификатор аккаунта
name человекочитаемое имя аккаунта
owner настройки доступа владельца (позволяет менять ключи)
active настройки доступа пользования (позволяет исполнять операции)
options дополнительные настройки, там же задается memo ключ

owner и active - это гибкая и сложная система управления доступом к аккаунту. Там могут задаваться как ключи, так и имена других пользователей

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

Аутентификация по memo ключу

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

Пользователь

Пользователь, владеющий текущим private_memo_key

Генерирует подпись signature = sign(private_memo_key, action + params + timestamp)

И отправляет ее вместе в запросом на сервис

id, action, params, timestamp, signature

Сервис

Получая запрос с данными от пользователя сервис:

Получает у бч текущий memo ключ пользователя - public_memo_key

и валидирует подпись

isValid = verify(public_memo_key, action + params + timestamp, signature)

если подпись валидна и timestamp не старее 5 минут, то одобряет запрос

АУТЕНТИФИЦИРОВАТЬ ПОЛЬЗОВАТЕЛЯ НУЖНО ТОЛЬКО В ЗАПРОСАХ НА ИЗМЕНЕНИЕ ДАННЫХ, чтение проходит без аутентификации

Упрощенный вариант авторизации

Использование все той же подписи, но подписывать только текущий timestamp.

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

т.е.

signature = sign(private_memo_key, timestamp)

isValid = verify(public_memo_key, timestamp, signature)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment