امضای پیام

برنامه شما می‌تواند از کاربر بخواهد پیامی متنی را با کلید انتشار یا کلید فعال خود امضا کند. امضا ثابت می‌کند که کاربر حساب را در اختیار دارد. چیزی منتشر نمی‌شود: پیام هرگز به زنجیره بلوکی نمی‌رسد. 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 امضا، به‌صورت رشته شانزده‌شانزدهی ۱۳۰ نویسه‌ای
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 فهرست حساب‌های او را باز می‌کند. نشانی بازگشت شما چیزی نمی‌گیرد.

هشدار: هر کسی می‌تواند نشانی بازگشت شما را با مقادیر ساختگی باز کند. تا زمانی که سرور شما امضا را بررسی نکرده، هر پارامتر را تنها یک ادعا بشمارید.

امضا را تأیید کنید

امضا را روی سرور خود بررسی کنید:

  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 را امضا می‌کند که پیام، حساب و زمان را در خود دارد. نتیجه را به‌عنوان توکن تأیید به اشتراک می‌گذارد. چنین توکنی را در صفحه تأیید پیام یا به شیوه‌ای که در خودتان بررسی کنید آمده بررسی کنید، نه با کد بالا.