احراز هویت با hash
اعتبارسنجی دادههای اولیه، یکی از مهمترین بخشهای ارتباط بین کلاینت و سرور است که اعتبار آن را تضمین میکند و میتوان به دادههای اولیه اعتماد کرد و در اجرای کد آینده استفاده کرد.
با دانستن اینکه دادههای اولیه (initData) به شکل لیست کوئری پارامتر در قالب string ارائه میشوند، برای تأیید اعتبار آنها، توسعه دهنده باید مراحل زیر را دنبال کند:
- دادههای اولیه (initData) را به یک آرایه از رشتهها به فرم
{مقدار}={کلید}
تبدیل کنید. مقدار کلیدhash
را جدا کرده و آن را در حافظه نگهدارید؛ زیرا این مقدار، نشاندهنده امضای دادههای اولیه است و در مرحله 6 برای اعتبارسنجی استفاده خواهد شد. - آرایه محاسبه شده را به ترتیب حروف الفبا مرتب کنید.
- جفت های
{مقدار}={کلید}
آرایه مرتب شده را با خط شکست (n\) بهم متصل کنید تا یک string بدست بیارید . - با کلید
WebAppData
یک HMAC-SHA256 روی توکن برنامه ایتا خود اعمال کنید . - با استفاده از نتیجه مرحله 4 به عنوان کلید، یک HMAC-SHA256 دیگر بسازید و نتیجه مرحله 3 اعمال کنید و نتیجه را به صورت دنباله نمادهای هگز ارائه دهید.
- مقدار
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) منتقل شده اعتماد کنیم.