فرآیند رمزنگاری شبکههای بلاک چین با استفاده از سیستمی پیچیده صورت میگیرد که در نهایت امنیت شبکه را تامین میکند. دادههای ورودی هر بلاک، با استفاده از فرآیند هشینگ (Hashing) به زنجیرهای تصادفی از اعداد و حروف تبدیل میشوند و استخراجکنندگان در ازای دریافت پاداش، این عملیات پیچیده ریاضی را انجام میدهند. در ادامه به بررسی مفصل فرآیند هشینگ و نحوه کار آن که از مبانی اساسی فناوری بلاک چین است میپردازیم.
به چه کار هش کردن (هشینگ) میگویند؟
نحوه کار هشینگ (هش کردن) از مباحث بسیار مهم آموزشی در زمینه بلاک چین است. تکنولوژی بلاک چین یکی از نوآورانهترین و خلاقانهترین تکنولوژیهای قرن اخیر است. نگاهی به تاثیر آن در طول سالهای اخیر و اثری که در آینده به جا خواهد گذاشت، نشان میدهد که در گفته خود اغراق نکردهایم. به منظور درک این موضوع میتوانید عملکرد رمز ارزهای متنوعی همچون اتریوم و بیت کوین را مطالعه کنید.
به زبان ساده، هش کردن یا هشینگ (Hashing) به معنای دریافت یک رشته با یک طول دلخواه و تبدیل آن به یک خروجی با طول ثابت است. در زمینه رمز ارزهایی همچون بیت کوین، تراکنشها به عنوان ورودی دریافت میشوند و از طریق یک الگوریتم هشینگ (بیت کوین از الگوریتم SHA-256 استفاده میکند.) به یک خروجی با طول ثابت تبدیل میشوند.
خب بیایید به نحوه کار پروسه هشینگ نگاهی بیندازیم. نحوه کار را با یک مثال توضیح میدهیم. در این مثال از الگوریتم SHA-256
(Secure Hashing Algorithm 256) استفاده میکنیم.
همانطور که میبینید، در هنگام استفاده از SHA-256 ، بزرگی و کوچکی ورودی شما اهمیتی ندارد و در هر صورت خروجی شما یک طول ثابت 256 بیتی خواهد داشت. این الگوریتم در هنگامی که شما با مقادیر عظیمی از دادهها و تراکنشها سر و کار دارید بسیار مناسب خواهد بود، چرا که به جای به خاطر سپردن دادههای ورودی که میتوانند بسیار زیاد و طولانی باشند، فقط هش تولید شده از آن را به خاطر سپرده و آن را انتقال میدهید. قبل از آنکه بیشتر به موضوع هشینگ بپردازیم، ابتدا لازم است که با خصوصیات گوناگون توابع هشینگ و چگونگی کاربرد آن در بلاک چین آشنا شوید.
یک تابع هش رمزنگاری ، یک کلاس ویژه از توابع هش است که خصوصیات گوناگون آن برای انجام رمزنگاری مناسب هستند. به منظور آنکه یک تابع هش رمزنگاری ایمن باشد، نیاز به احراز خصوصیات ویژهای دارد که در ادامه آنها را یک به یک بررسی خواهیم کرد.
این ویژگی به آن معناست که مهم نیست که شما چند بار یک ورودی دلخواه را وارد تابع هش میکنید، در هر بار شما باید یک نتیجه یکسان دریافت کنید. این موضوع بسیار حیاتی است، چرا که اگر در هر بار یک هش متفاوت دریافت کنید، ردگیری ورودی غیرممکن خواهد شد.
یک تابع هش باید قادر باشد تا ورودی را به سرعت تبدیل به هش کند. اگر این فرآیند به اندازه کافی سریع نباشد، سیستم ما کارآمد نخواهد بود.
تابع هش ما باید به گونهای باشد که اگر ما ورودی خود را A در نظر بگیریم و هش خروجی را (H(A در نظر بگیریم، رسیدن به A از روی (H(A غیرعملی باشد. در اینجا عمدا از کلمه غیرعملی به جای کلمه غیرممکن استفاده کردهایم. همانطور که میدانید رسیدن به ورودی یک تابع هش از روی جواب آن غیرممکن نیست. بیاید با یک مثال این موضوع را بررسی کنیم.
فرض کنید که شما تاسی را میاندازید و خروجی آن، هش عددی است که تاس نشان میدهد. چگونه میتوانید از روی هش عدد ورودی را تشخیص دهید؟ این کار ساده است، فقط کافی است که هش اعداد یک تا شش را بدانید و سپس با مقایسه آن با هشهای به دست آمده، متوجه شوید که ورودی کدامیک از اعداد یک تا شش است. از آنجایی که توابع هش دارای جواب قطعی و ثابت هستند، هش یک ورودیِ به خصوص همیشه یکسان است، بنابراین شما به راحتی میتوانید با مقایسه هشها ورودی اصلی را حدس بزنید.
اما این راهکار فقط هنگامی جواب میدهد که با حجم کمی از دادهها سر و کار داشته باشیم. هنگامی که حجم دادهها عظیم باشد، چه اتفاقی میافتد؟ فرض کنید که با یک هش 128 بیتی سر و کار دارید. تنها روشی که شما به وسیله آن میتوانید ورودی اولیه را پیدا کنید، استفاده از متد brute-force است. متد brute-force اساسا به این معناست که شما یک ورودی تصادفی برمیدارید و پس از هشینگ (هش کردن)، خروجی را با هش مورد نظر خود مقایسه میکنید و این کار را تا زمان رسیدن به یک تطابق ادامه میدهید.
پس در نتیجه شما با متد brute force قادر خواهید بود تا ورودی را از روی هش پیدا کنید، اما اینکار زمان بسیار زیادی لازم دارد و عملا انجام آن بی فایده است.
حتی اگر تغییر کوچکی در ورودی خود بدهید، تغییرات هش خروجی بسیار زیاد خواهد بود. بیاید این مساله را با استفاده از SHA-256 تست کنیم :
همانطور که میبینید، فقط حرف اول جمله را کوچک کردهایم، اما تغییرات اعمال شده در هش نهایی بسیار زیاد است. این یک ویژگی حیاتی است، چرا که این ویژگی منتهی به یکی از مهمترین ویژگیهای بلاک چین، یعنی غیر قابل دستکاری بودن آن میشود.
دو ورودی متفاوت A و B ، با هشهای (H(A و (H(B را در نظر بگیرید، (H(A و (H(B نمیتوانند باهم برابر باشند. به عبارت کلیتر، در اکثر اوقات هر ورودی ، هش منحصر به فرد خود را دارد. چرا گفتیم اکثر اوقات؟ بیاید در مورد یک موضوع جالب به نام پارادوکس روز تولد (The Birthday Paradox) صحبت کنیم تا دلیل این موضوع را متوجه شوید.
اگر شما در خیابان تصادفا با یک غریبه برخورد کنید، احتمال آنکه هر دوی شما در یک روز به دنیا آمده باشید، بسیار کم است. در حقیقت احتمال این اتفاق 1/365 یا 0.27% است. به عبارت دیگر احتمال واقعا پایینی است.
با این حال میتوان گفت که اگر شما 20 الی 30 نفر را در یک اتاق دور هم جمع کنید، احتمال آنکه دو شخص تاریخ تولد خود را اعلام کنند و دقیقا در یک روز به دنیا آمده باشند، به صورت نجومی بالا میرود. در حقیقت احتمال این موضوع که 2 شخص تاریخ تولد خود را اعلام کنند و هر دو در یک تاریخ به دنیا آمده باشند، پنجاه پنجاه میشود.
چگونه چنین چیزی رخ میدهد؟ این قضیه به یک قانون ساده در احتمال بر میگردد. فرض کنید که شما N احتمال گوناگون برای وقوع یک اتفاق دارید، برای آنکه شانس رخداد آن اتفاق پنجاه درصد شود، باید جذر N آیتم تصادفی را محاسبه کنید.
حال اگر این نظریه را برای روز تولد اعمال کنیم، شما 365 احتمال گوناگون برای روزهای تولد دارید، خب حالا نیاز دارید که جذر 365 را بگیرید که برابر با 23 میشود، بنابراین اگر 23 فرد را به صورت تصادفی انتخاب کنید، احتمال آنکه دو شخص در یک روز به دنیا آمده باشند، پنجاه پنجاه میشود.
به دلیل طولانی بودن مطلب جهت خواندن ادامه مطلب به لینک داده شده در منبع مراجعه کنید.