Podpisywanie wiadomości
Twoja aplikacja może poprosić osobę o podpisanie wiadomości tekstowej jej kluczem publikowania albo aktywnym. Podpis dowodzi, że osoba zarządza kontem. Nic nie zostaje rozgłoszone: wiadomość nigdy nie trafia do blockchaina. Hivesigner podpisuje tak samo jak requestSignBuffer z Hive Keychain, więc kod serwera sprawdzający podpis z Keychain sprawdzi też podpis z Hivesigner.
Poproś o podpis
Wyślij osobę pod adres https://hivesigner.com/sign-buffer z tymi parametrami zapytania:
| Parametr | Wymagany | Znaczenie |
|---|---|---|
message |
Tak | Dokładny tekst do podpisania. Musi zawierać coś więcej niż same spacje. |
redirect_uri |
Tak | Dokąd Hivesigner wysyła wynik. Zobacz Zasady adresu zwrotnego. |
authority |
Nie | posting albo active, w dowolnej wielkości liter (Posting też działa). Przy braku albo pustej wartości posting. Każda inna wartość zostaje odrzucona. |
client_id |
Nie | Konto Twojej aplikacji. Odczytywane jest też clientId. Z nim redirect_uri musi być jednym z adresów zwrotnych Twojej aplikacji. |
state |
Nie | Dowolna wartość. Hivesigner zwraca ją bez zmian. |
account |
Nie | Konto, od którego oczekujesz podpisu. Hivesigner wybiera je, gdy jest na urządzeniu, a w innym razie pomija. Odczytywane jest też select_account. |
Zbuduj adres przy użyciu URLSearchParams, aby każda wartość została zakodowana:
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}`);
Zasady adresu zwrotnego
- Adres zwrotny musi być
https://. Zwykłyhttp://działa tylko na pętli zwrotnej:localhost,127.0.0.1albo[::1]. - Z
client_idadres zwrotny musi być zarejestrowany na tym koncie aplikacji, sprawdzany tak samo jak przy logowaniu. Zobacz Adresy zwrotne. Hivesigner odczytuje adresy zwrotne aplikacji z Hive, gdy otwiera się żądanie, i niczego nie podpisze, zanim ich nie odczyta. Gdy Hive jest nieosiągalne, osoba dostaje przycisk Ponów. - Bez
client_idwystarczy dowolny adres zwrotny spełniający pierwszą zasadę. Hivesigner wskazuje wtedy host tego adresu jako proszącego, na przykład «HOST prosi Cię o podpisanie wiadomości.».
Wysyłaj client_id, gdy masz konto aplikacji. Osoba widzi wtedy nazwę i konto Twojej aplikacji. Podpis mogą otrzymać tylko Twoje zarejestrowane adresy zwrotne.
Hivesigner odrzuca żądanie bez wiadomości, z nieznanym authority, z brakującym albo nieużywalnym adresem zwrotnym, z client_id, które nie jest kontem Hive, albo z adresem zwrotnym niezarejestrowanym na tej aplikacji. Osoba widzi «Tego żądania podpisu nie można użyć: potrzebuje wiadomości, klucza publikowania lub aktywnego oraz bezpiecznego adresu przekierowania zarejestrowanego dla aplikacji. Wróć do witryny i spróbuj ponownie.» i przycisk Zgłoś ten problem.
Co widzi osoba
- Nagłówek wskazujący Twoją aplikację (albo host adresu zwrotnego) oraz «Przekieruje Cię na adres HOST».
- Całą wiadomość, dokładnie tak, jak zostanie podpisana. Znaki, które mogłyby ukryć tekst albo zmienić jego kierunek, pokazywane są jako kody, na przykład
\u{200B}. - «Podpis Twoim kluczem publikowania» albo «Podpis Twoim kluczem aktywnym».
- Ostrzeżenie: «Twój podpis dowodzi każdemu, kto go zobaczy, że @USERNAME podpisał dokładnie ten tekst. Podpisuj tylko wiadomość, którą rozumiesz.»
- Podpisz i Anuluj. Zablokowane konto prosi najpierw o kod dostępu.
Żądania podpisania wiadomości opisują ten ekran dla użytkowników.
Co dostaje Twój adres zwrotny
Gdy osoba wybierze Podpisz, Hivesigner wysyła ją na Twój adres zwrotny z tymi parametrami zapytania:
| Parametr | Wartość |
|---|---|
signature |
Podpis, jako ciąg szesnastkowy o 130 znakach |
public_key |
Klucz publiczny klucza, który podpisał, na przykład STM... |
username |
Konto, które podpisało |
authority |
posting albo active |
state |
Twoje state, ilekroć żądanie je miało (również puste) |
Hivesigner dopisuje je do zapytania Twojego adresu, po ? albo & i przed jakimkolwiek #fragment. Twoje własne zapytanie zostaje bez zmian.
https://YOUR_APP/signed?signature=SIGNATURE&public_key=PUBLIC_KEY&username=USERNAME&authority=posting&state=STATE
Gdy osoba wybierze Anuluj, Hivesigner otwiera jej listę kont. Twój adres zwrotny nie dostaje nic.
Ostrzeżenie: Każdy może otworzyć Twój adres zwrotny ze zmyślonymi wartościami. Traktuj każdy parametr jako twierdzenie, dopóki Twój serwer nie sprawdzi podpisu.
Zweryfikuj podpis
Sprawdź podpis na swoim serwerze:
- Wiadomość, o którą prosiłeś, trzymaj na swoim serwerze razem z jej
state. Nie ufaj kopii wracającej z przeglądarki. - Policz skrót wiadomości: sha256 z jej bajtów UTF-8.
- Odzyskaj klucz publiczny z podpisu i tego skrótu.
- Wczytaj konto z Hive. Sprawdź, czy odzyskany klucz należy do uprawnienia, o które prosiłeś, i ma wagę wystarczającą do samodzielnego podpisu.
- Sprawdź, czy
statejest tym, które wydałeś. Każdą wiadomość przyjmij raz.
Ten przykład używa 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,
);
}
To samo sprawdzenie działa dla podpisu z requestSignBuffer w Hive Keychain. Porównuj z kluczem, który odzyskałeś: public_key w adresie zwrotnym to tylko wskazówka.
Wiadomości, których Hivesigner nie podpisuje
Wiadomość będąca obiektem JSON z kluczem signed_message ma postać tokenu Hivesigner. Jej podpisanie dałoby proszącemu dostęp do konta osoby. Hivesigner nigdy nie podpisuje takiej wiadomości. Mówi osobie «Ta wiadomość jest tokenem Hivesigner. Jej podpisanie dałoby witrynie dostęp do Twojego konta, dlatego nie można jej podpisać.»
Używaj zwykłego tekstu albo JSON bez klucza signed_message. Napisz, do czego służy podpis, i dodaj wartość, którą tworzysz raz, na przykład:
Confirm your account for YOUR_APP
Account: USERNAME
Nonce: NONCE
Narzędzie Podpisz wiadomość
Ludzie mogą też sami podpisać wiadomość na https://hivesigner.com/signmessage (Podpisz wiadomość) i sprawdzić ją na https://hivesigner.com/verifymessage (Zweryfikuj wiadomość). Zobacz Podpisz wiadomość samodzielnie.
To narzędzie podpisuje inaczej niż /sign-buffer. Podpisuje treść tokenu Hivesigner zawierającą wiadomość, konto i czas. Wynik udostępnia jako Token weryfikacyjny. Taki token sprawdzaj na stronie Zweryfikuj wiadomość albo tak, jak opisuje Sprawdź samodzielnie, a nie kodem powyżej.