Подписване на съобщения

Вашето приложение може да помоли потребител да подпише текстово съобщение със своя posting или active ключ. Подписът доказва, че потребителят контролира акаунта. Нищо не се излъчва: съобщението никога не стига до блокчейна. Hivesigner подписва по същия начин като requestSignBuffer на Hive Keychain, затова сървърният код, който проверява подпис от Keychain, проверява и подпис от Hivesigner.

Поискайте подпис

Изпратете потребителя към https://hivesigner.com/sign-buffer с тези query параметри:

Параметър Задължителен Значение
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 акаунт, или с адрес, нерегистриран на това приложение. Потребителят вижда "Тази заявка за подпис не може да се използва: нужни са съобщение, posting или active ключ и защитен URL адрес за пренасочване, регистриран за приложението. Върнете се в сайта и опитайте отново." и бутон Докладвайте този проблем.

Какво вижда потребителят

  • Заглавие, което назовава вашето приложение (или хоста на адреса) и "Ще ви пренасочи към HOST".
  • Цялото съобщение, точно както ще бъде подписано. Символите, които биха могли да скрият текст или да променят посоката му, се показват като кодове, например \u{200B}.
  • "Подписва се с вашия posting ключ" или "Подписва се с вашия active ключ".
  • Предупреждение: "Подписът ви доказва на всеки, който го види, че @USERNAME е подписал точно този текст. Подписвайте само съобщение, което разбирате."
  • Подпиши и Отказ. Заключеният акаунт първо иска своя код за достъп.

Заявки за подписване на съобщение описва екрана за потребителите.

Какво получава вашият адрес

Когато потребителят избере Подпиши, Hivesigner го изпраща към вашия адрес с тези query параметри:

Параметър Стойност
signature Подписът, като шестнадесетичен низ от 130 символа
public_key Публичният ключ на ключа, който е подписал, например STM...
username Акаунтът, който е подписал
authority posting или active
state Вашият state, когато заявката е имала такъв (включително празен)

Hivesigner ги добавя към query на вашия адрес, след ? или & и преди всеки #fragment. Вашият собствен query остава непроменен.

https://YOUR_APP/signed?signature=SIGNATURE&public_key=PUBLIC_KEY&username=USERNAME&authority=posting&state=STATE

Когато потребителят избере Отказ, Hivesigner отваря списъка му с акаунти. Вашият адрес не получава нищо.

Внимание: Всеки може да отвори вашия адрес с измислени стойности. Приемайте всеки параметър за твърдение, докато сървърът ви не провери подписа.

Проверете подписа

Проверете подписа на своя сървър:

  1. Пазете на сървъра си съобщението, което сте поискали, заедно с неговия state. Не се доверявайте на копие, което се връща от браузъра.
  2. Хеширайте съобщението: sha256 върху неговите UTF-8 байтове.
  3. Възстановете публичния ключ от подписа и този хеш.
  4. Заредете акаунта от Hive. Проверете, че възстановеният ключ принадлежи на правомощията, които сте поискали, с достатъчна тежест да подписва сам.
  5. Проверете, че 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, което съдържа съобщението, акаунта и времето. Споделя резултата като Токен за проверка. Проверявайте такъв токен на страницата Проверка на съобщение или както е описано в Проверете го сами, а не с кода по-горе.