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

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

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

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

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

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

سپس، HMAC-SHA256 مورد نیاز را در مرحله 3 ایجاد کنید. باید بر اساس مقدار تحت اللفظی رشته WebAppData و توکن برنامه ایتا باشد.

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

در نهایت، بیایید امضای داده‌های اولیه را با استفاده از جفت‌های دریافت شده و مرتب شده در مرحله دوم و مقدار مرحله 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(
"aa492a44bdf019c759defb1698c1d77690189973945491a756051cdc1207a449",
joined_pairs,
) = "c3bb1efcada7b75eec382110554ab07e57622e982a72cac38ba3e64f51d40bb9"

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