پرش به مطلب اصلی

احراز هویت با hash

اعتبارسنجی داده‌های اولیه، یکی از مهم‌ترین بخش‌های ارتباط بین کلاینت و سرور است که اعتبار آن را تضمین می‌کند و می‌توان به داده‌های اولیه اعتماد کرد و در اجرای کد آینده استفاده کرد.

با دانستن اینکه داده‌های اولیه (initData) به شکل لیست کوئری پارامتر در قالب string ارائه می‌شوند، برای تأیید اعتبار آن‌ها، توسعه دهنده باید مراحل زیر را دنبال کند:

  1. داده‌های اولیه (initData) را به یک آرایه از رشته‌ها به فرم {مقدار}={کلید} تبدیل کنید. مقدار کلید hash را جدا کرده و آن را در حافظه نگهدارید؛ زیرا این مقدار، نشان‌دهنده امضای داده‌های اولیه است و در مرحله 6 برای اعتبارسنجی استفاده خواهد شد.
  2. آرایه محاسبه شده را به ترتیب حروف الفبا مرتب کنید.
  3. جفت های {مقدار}={کلید} آرایه مرتب شده را با خط شکست (n\) بهم متصل کنید تا یک string بدست بیارید .
  4. با کلید WebAppData یک HMAC-SHA256 روی توکن برنامه ایتا خود اعمال کنید .
  5. با استفاده از نتیجه مرحله 4 به عنوان کلید، یک HMAC-SHA256 دیگر بسازید و نتیجه مرحله 3 اعمال کنید و نتیجه را به صورت دنباله نمادهای هگز ارائه دهید.
  6. مقدار hash دریافتی در مرحله 1 را با نتیجه مرحله 5 مقایسه کنید.
نکته

در برنامه‌های کاربردی در دنیای واقعی، استفاده از مکانیسم‌های اضافی برای تأیید داده‌های اولیه توصیه می‌شود. به عنوان مثال می‌توان تاریخ انقضا آنها را به اعتبارسنجی داده‌ها اضافه کرد. این بررسی را می‌توان با استفاده از پارامتر auth_date که مسئول تاریخ ایجاد پارامترها است، پیاده‌سازی کرد. این راه حل، اجازه می‌دهد تا در صورت سرقت داده‌های اولیه، از استفاده مداوم از آن‌ها توسط مهاجم جلوگیری شود.

نکته

برای جلوگیری از مشکلات احتمالی مربوط به فرآیند اعتبارسنجی داده‌های اولیه، توصیه می‌شود از بسته‌های به خوبی تثبیت شده و آزمایش شده استفاده کنید:

مثال

بیایید تصور کنیم این ورودی را داریم:

Eitaa Bot token:
5768337691:AAGDAe6rjxu1cUgxK4BizYi--Utc3J9v5AU

Init data:
auth_date=1709144340
&device_id=5d41402abc4b2a76b9719d911017c592
&chat_instance=-3788475317572404878
&chat_type=private
&user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22%D9%85%D9%87%D8%AF%DB%8C%22%2C%22last_name%22%3A%22%D9%87%D8%A7%D8%B4%D9%85%DB%8C%22%2C%22language_code%22%3A%22fa%22%2C%22allows_write_to_pm%22%3Atrue%7D
&hash=c3bb1efcada7b75eec382110554ab07e57622e982a72cac38ba3e64f51d40bb9

پس از مراحل 1 و 2 باید داده‌های زیر را دریافت کنیم:

// Sorted pairs.
[
'auth_date=1709144340',
'chat_instance=-3788475317572404878',
'chat_type=private',
'device_id=5d41402abc4b2a76b9719d911017c592',
'user={"id":279058397,"first_name":"مهدی","last_name":"هاشمی","language_code":"fa","allows_write_to_pm":true}'
]

// Hash.
'c3bb1efcada7b75eec382110554ab07e57622e982a72cac38ba3e64f51d40bb9'

سپس، string مورد نیاز را در مرحله 3 ایجاد کنید.

joined_pairs =
"auth_date=1709144340
chat_instance=-3788475317572404878
chat_type=private
device_id=5d41402abc4b2a76b9719d911017c592
user={\"id\":279058397,\"first_name\":\"مهدی\",\"last_name\":\"هاشمی\",\"language_code\":"\fa\",\"allows_write_to_pm\":true}"

سپس، HMAC-SHA256 مورد نیاز را در مرحله 4 ایجاد کنید .

HMAC-SHA256(
"WebAppData",
"5768337691:AAGDAe6rjxu1cUgxK4BizYi--Utc3J9v5AU"
) = "aa492a44bdf019c759defb1698c1d77690189973945491a756051cdc1207a449"

دنباله نمادهای هگز مرحله 5 رو بدست اورید .

HMAC-SHA256(
"aa492a44bdf019c759defb1698c1d77690189973945491a756051cdc1207a449",
joined_pairs,
) = "c3bb1efcada7b75eec382110554ab07e57622e982a72cac38ba3e64f51d40bb9"

در آخر ، اگر نمادهای هگز با مقدار hash از مرحله 1 برابر بود ، این بدان معناست که ما می‌توانیم به داده‌های اولیه (initData) منتقل شده اعتماد کنیم.