Підписування повідомлень
Ваш застосунок може попросити користувача підписати текстове повідомлення своїм ключем публікації або активним ключем. Підпис доводить, що користувач контролює обліковий запис. Нічого не надсилається в мережу: повідомлення ніколи не потрапляє в блокчейн. Hivesigner підписує так само, як requestSignBuffer у Hive Keychain, тож серверний код, який перевіряє підпис Keychain, перевіряє й підпис Hivesigner.
Попросіть підпис
Надішліть користувача на https://hivesigner.com/sign-buffer з такими параметрами запиту:
| Параметр | Обов’язковий | Що означає |
|---|---|---|
message |
Так | Точний текст для підпису. Він має містити щось, крім пробілів. |
redirect_uri |
Так | Куди Hivesigner надсилає результат. Див. Правила зворотного виклику. |
authority |
Ні | posting або active, у будь-якому регістрі (Posting теж підходить). posting, коли його немає або воно порожнє. Будь-яке інше значення відхиляється. |
client_id |
Ні | Обліковий запис вашого застосунку. clientId теж читається. З ним redirect_uri має бути однією з адрес зворотного виклику вашого застосунку. |
state |
Ні | Будь-яке значення. Hivesigner повертає його без змін. |
account |
Ні | Обліковий запис, від якого ви чекаєте підпису. Hivesigner вибирає його, коли він є на пристрої, і ігнорує інакше. select_account теж читається. |
Будуйте адресу через URLSearchParams, щоб кожне значення було закодовано:
const params = new URLSearchParams({
message: 'MESSAGE',
authority: 'posting',
redirect_uri: 'REDIRECT_URI',
client_id: 'CLIENT_ID',
state: 'STATE',
});
window.location.assign(`https://hivesigner.com/sign-buffer?${params}`);
Правила зворотного виклику
- Адреса зворотного виклику має бути
https://. Звичайнийhttp://працює лише на петльовому інтерфейсі:localhost,127.0.0.1або[::1]. - З
client_idадресу має бути зареєстровано в цьому обліковому записі застосунку й звірено так само, як для входу. Див. Адреси зворотного виклику. Hivesigner читає адреси застосунку з Hive, коли відкривається запит, і нічого не підписує, доки їх не прочитає. Коли Hive недосяжний, користувач отримує кнопку Повторити. - Без
client_idпрацює будь-яка адреса, що відповідає першому правилу. Тоді Hivesigner називає як запитувача хост адреси зворотного виклику, наприклад «HOST просить вас підписати повідомлення.»
Надсилайте client_id, коли маєте обліковий запис застосунку. Тоді користувач бачить назву й обліковий запис вашого застосунку. Отримати підпис можуть лише ваші зареєстровані адреси зворотного виклику.
Hivesigner відхиляє запит без повідомлення, з невідомим authority, з відсутньою чи непридатною адресою зворотного виклику, з client_id, який не є обліковим записом Hive, або з адресою, не зареєстрованою в цьому застосунку. Користувач бачить «Цей запит на підпис не можна використати: потрібні повідомлення, ключ публікації або активний ключ і захищена URL-адреса перенаправлення, зареєстрована для застосунку. Поверніться на сайт і спробуйте ще раз.» і кнопку Повідомити про цю проблему.
Що бачить користувач
- Заголовок, у якому названо ваш застосунок (або хост адреси зворотного виклику), і «Перенаправить вас на HOST».
- Усе повідомлення точно в тому вигляді, у якому його буде підписано. Символи, які могли б приховати текст або змінити його напрямок, показано як коди, наприклад
\u{200B}. - «Підписується вашим ключем публікації» або «Підписується вашим активним ключем».
- Попередження: «Ваш підпис доводить кожному, хто його побачить, що @USERNAME підписав саме цей текст. Підписуйте лише повідомлення, яке розумієте.»
- Підписати і Скасувати. Заблокований обліковий запис спершу просить код доступу.
Запити на підпис повідомлення описують цей екран для користувачів.
Що отримує ваша адреса зворотного виклику
Коли користувач вибирає Підписати, Hivesigner надсилає його на вашу адресу зворотного виклику з такими параметрами запиту:
| Параметр | Значення |
|---|---|
signature |
Підпис як шістнадцятковий рядок із 130 символів |
public_key |
Відкритий ключ того ключа, що підписав, наприклад STM... |
username |
Обліковий запис, який підписав |
authority |
posting або active |
state |
Ваш state, коли запит його мав (зокрема й порожній) |
Hivesigner додає їх до рядка запиту вашої адреси, після ? або & і перед будь-яким #fragment. Ваш власний рядок запиту лишається як є.
https://YOUR_APP/signed?signature=SIGNATURE&public_key=PUBLIC_KEY&username=USERNAME&authority=posting&state=STATE
Коли користувач вибирає Скасувати, Hivesigner відкриває його список облікових записів. Ваша адреса зворотного виклику не отримує нічого.
Попередження: будь-хто може відкрити вашу адресу зворотного виклику з вигаданими значеннями. Вважайте кожен параметр лише твердженням, доки ваш сервер не перевірив підпис.
Перевірте підпис
Перевіряйте підпис на своєму сервері:
- Тримайте повідомлення, яке ви просили, на своєму сервері разом із його
state. Не довіряйте копії, що повертається з браузера. - Обчисліть хеш повідомлення: sha256 над його байтами UTF-8.
- Відновіть відкритий ключ із підпису й цього хешу.
- Завантажте обліковий запис із Hive. Перевірте, що відновлений ключ належить до повноважень, які ви просили, і має достатню вагу, щоб підписати самостійно.
- Перевірте, що
stateце те значення, яке ви видали. Приймайте кожне повідомлення один раз.
Цей приклад використовує dhive (https://www.npmjs.com/package/@hiveio/dhive):
import { Client, Signature, cryptoUtils } from '@hiveio/dhive';
const hive = new Client(['https://api.hive.blog']);
// message and authority: what you asked for, from your own records.
// signature and username: from the callback.
export async function verifySignBuffer({ message, authority, signature, username }) {
let recovered;
try {
const hash = cryptoUtils.sha256(message); // sha256 over the UTF-8 bytes
recovered = Signature.fromString(signature).recover(hash).toString();
} catch {
return false; // not a valid signature
}
const [account] = await hive.database.getAccounts([username]);
if (!account) return false;
const auth = account[authority]; // 'posting' or 'active'
return auth.key_auths.some(
([key, weight]) => key === recovered && weight >= auth.weight_threshold,
);
}
Та сама перевірка працює для підпису з requestSignBuffer у Hive Keychain. Порівнюйте з ключем, який ви відновили: public_key у зворотному виклику це лише підказка.
Повідомлення, які Hivesigner не підписує
Повідомлення, яке є об’єктом JSON із ключем signed_message, має форму токена Hivesigner. Підписати його означало б дати запитувачу доступ до облікового запису користувача. Hivesigner ніколи не підписує таке повідомлення. Він каже користувачеві «Це повідомлення є токеном Hivesigner. Підписавши його, ви дасте сайту доступ до свого облікового запису, тому його не можна підписати.»
Використовуйте звичайний текст або JSON без ключа signed_message. Напишіть, для чого потрібен підпис, і додайте значення, яке ви генеруєте один раз, наприклад:
Confirm your account for YOUR_APP
Account: USERNAME
Nonce: NONCE
Інструмент підписування повідомлень
Люди також можуть самі підписати повідомлення на https://hivesigner.com/signmessage (Підписати повідомлення) і перевірити його на https://hivesigner.com/verifymessage (Перевірити повідомлення). Див. Підпишіть повідомлення самі.
Той інструмент підписує інакше, ніж /sign-buffer. Він підписує тіло токена Hivesigner, яке містить повідомлення, обліковий запис і час. Результатом він ділиться як Токен перевірки. Перевіряйте такий токен на сторінці Перевірити повідомлення або так, як описано в Перевірте самостійно, а не кодом вище.