رمزنگاری (Cryptography) چیست؟


در این مقاله قصد داریم تا به بررسی یکسری مفاهیم اولیۀ مرتبط با مفهوم Cryptography (رمزنگاری) بپردازیم که هر دولوپری به منظور تأمین امنیت اپلیکیشن خود از یکسو و همچنین حصول اطمینان از ایمن بودن دیتای کاربران از سوی دیگر باید با آن‌ها آشنایی داشته باشد که برخی از مهم‌ترین آن‌ها عبارتند از فانکشن‌های هَش، فانکشن‌های مربوط به تبدیل پسورد به یک کلید غیرقابل رمزگشایی + پروتکل‌های تبادل این کلید، تکنیک‌های رمزنگاری متقارن و نامتقارن، امضای دیجیتال، فانکشن‌های مربوط به تأیید اعتبار پیام و همچنین مفهوم تولید اعداد رندوم به منظور افزایش امنیت کلیدها.

متدهای رمزنگاری به تدریج و به مرور زمان از اولین الگوریتم‌های رمزنگاری همچون MD5 و DES به الگوریتم‌های مدرن امروزی مانند SHA-3 ،Argon2 و ChaCha20 تکامل یافته‌اند که برای آشنایی بیشتر با برخی از این الگوریتم‌ها، می‌توانید به مقالات زیر مراجعه نمایید:

- منظور از MD5 ،SHA-1 و SHA-256 در کنار فایل‌های دانلودی چیست؟
- SHA-1: الگوریتم رمزنگاری آسیب‌پذیر و هَک‌شدنی

Cryptography یا رمزنگاری فرآیند تأمین امنیت اپلیکیشن‌ها و محافظت از دیتای مربوط به آن‌ها در برابر انواع حملات است و این مفهوم در تمامی حوزه‌های فضای مجازی به کار گرفته می‌شود که از آن جمله می‌توان رمزنگاری در لاگین کردن به یک وب‌سایت، ارسال ایمیل یا اتصال به شبکه وای‌فای را نام برد و از همین روی هم دولوپرها باید با مفاهیم پایه‌ای رمزنگاری، نحوۀ استفاده از الگوریتم‌های رمزنگاری و کار با لایبرری‌های این حوزه آشنایی داشته باشند تا بتوانند فرآیندهای هَشینگ، رمزگذاری متقارن و نامتقارن، انواع تکنیک‌های رمزنگاری، امضای دیجیتال، سیستم‌های رمزنگاری و الگوریتم‌های آن‌ها را درک کنند و همان‌طور که پیش‌تر اشاره کردیم، تأمین امنیت در تمامی حوزه‌های دیجیتال از جمله وب اپلیکیشن‌ها موضوعی حائز اهمیت است که برای کسب اطلاعات بیشتر در این مورد توصیه می‌کنیم به مقالهٔ چگونه امنیت وب اپلیکیشن خود را ارتقاء بخشیم؟ مراجعه نمایید.

آشنایی با مفهوم کلیدهای رمزنگاری
همان‌طور که گفتیم، هدف از رمزنگاری ذخیره‌سازی و انتقال دیتا به شیوه‌ای امن است به طوری که در فرآیند ارسال و دریافت دیتا در بستر ناامن اینترنت، صرفاً افراد مد نظر ما توانایی رمزگشایی دیتای رمزگذاری‌شده را داشته باشند و برای این منظور نیز می‌توان تکنیک‌های رمزگذاری و رمزگشایی به شیوۀ Symmetric (متقارن) و Asymmetric (نامتقارن) را به کار برد که در آن‌ها یک یا چند کلید برای تبدیل دیتا از حالت ساده به فرم رمزگذاری‌شده و بالعکس مورد استفاده قرار می‌گیرد.

در متد رمزنگاری به شیوۀ متقارن از کلیدی یکسان هم برای رمزگذاری و هم رمزگشایی دیتا استفاده می‌شود اما این در حالی است که در رمزنگاری به شیوۀ نامتقارن از یک جفت Public Key (کلید عمومی) و Private Key (کلید خصوصی) استفاده می‌شود که برای کسب اطلاعات بیشتر در رابطه با مفهوم کلیدهای پابلیک و پرایوت و همچنین کاربرد آن‌ها در رمزگذاری‌های متقارن و نامتقارن، توصیه می‌کنیم به دورهٔ وب چگونه کار می‌کند؟ مراجعه نمایید.

Digital Signature (امضاء دیجیتال) چیست؟
در رمزنگاری، امضاء دیجیتال به منظور تضمین اعتبار دیتا، یکپارچگی و صحت آن کاربرد دارد و اکثر الگوریتم‌های امضاء دیجیتال از کلیدهای نامتقارن (کلید خصوصی و عمومی) برای به اصطلاح امضاء کردن دیتاهای ارسالی استفاده می‌کنند بدین صورت که در ابتدا دیتای مد نظر با کلید خصوصی امضاء می‌شود و در سَمت گیرنده نیز این امضاء با کلید عمومی مربوطه رمزگشایی می‌شود (برای مثال، در سیستم‌های بانکی امضاء‌های دیجیتال به منظور تأیید انجام تراکنش‌ها استفاده می‌شوند و در تراکنش‌های امضاءشدۀ بلاکچین نیز کاربران می‌توانند به روشی ایمن کریپتوکارنسی خود را از یک حساب به حساب دیگری منتقل کنند.)

آشنایی با فرآیند تولید کلیدها در رمزنگاری
همان‌طور که پیش از این گفتیم، رمزنگاری به منظور محافظت از فرآیند انتقال دیتا در بستر اینترنت انجام می‌شود و برای این منظور نیز باید دیتای مذکور با استفاده از یکسری Key رمزگذاری شوند که در همین راستا این کلیدها باید غیرقابل‌پیش‌بینی بوده و نتوان آن‌ها را رمزگشایی کرد به طوری که باید به صورت تصادفی تولید شده و هیچ‌ فرد دیگری قادر بر تولید همان اعداد تصادفی نباشد که برای این منظور نیز یکسری الگوریتم تولیدکنندۀ اعداد تصادفی همچون CSPRNG به کار گرفته می‌شود. اعداد تصادفی به واسطۀ ماهیت‌شان قابل‌پیش‌بینی نیستند و در همین راستا نیز حفظ امنیت این الگوریتم‌ها از اهمیت بالایی برخوردار است چرا که هر گونه نقطۀ ضعف در سیستم تولید اعداد تصادفی به معنای به خطر افتادن اپلیکیشن مد نظر است.

در پروسهٔ رمزنگاری، الگوریتم‌های تبادل کلید همچون Diffie-Hellman و ECDH از اهمیت بالایی برخوردارند. در واقع، تبادل کلید به‌کاررفته در رمزنگاری دیتا باید به صورت امن مابین دو طرفی انجام شود که قصد دارند تا پیامی را با استفاده از رمزنگاری و به صورت ایمن منتقل کنند تا دیتای مذکور در سمت گیرنده قابل‌رمزگشایی باشد که معمولاً تبادل کلید طی برقراری هر کانکشن جدید مابین دو طرف انجام می‌شود (برای مثال هنگامی که یک وب‌سایت را باز می‌کنید، نیاز است تا در ابتدا کلیدهای مورد استفاده در رمزنگاری مابین شما و سرور مبادله شوند.)

آشنایی با مفهوم هَشینگ در رمزنگاری و کاربردهای آن
در رمزنگاری، یکسری Hash Function همچون SHA-3 به کار گرفته می‌شوند که پیام یا دیتای کاربران را به یک مجموعۀ هَش (اعدادی به طول ثابت) تبدیل می‌کنند که پس از فرآیند هَش، دیگر نمی‌توان دیتای رمزگذاری‌شده را رمزگشایی کرد به طوری که خروجی این فانکشن‌ها به ازای ورودی‌های مختلف منحصربه‌فرد است (برای آشنایی بیشتر با تفاوت‌های هَش و رمزگذاری می‌توانید به مقالۀ چه تفاوت‌هایی میان Encryption و Hashing وجود دارد؟ مراجعه نمایید.) برای مثال، در سیستم‌های بلاکچین فرآیند هَشینگ به منظور تأمین امنیت سیستم و برای تولید آدرس‌های بلاکچین، شناسۀ تراکنش و بسیاری از الگوریتم‌ها و پروتکل‌های دیگر استفاده می‌شود. همچنین در گیت تولید شناسۀ منحصربه‌فرد برای فایل‌ها و کامیت‌ها نیز از طریق فرآیند هَشینگ انجام می‌شود.

در مورد اپلیکیشن‌ها نیز پسوردها، داکیومنت‌های مربوط به این پسوردها و دیتای کاربران از طریق فرآیند هَشینگ محافظت می‌شوند بدین طریق که پسوردها از طریق الگوریتم‌هایی همچون Scrypt یا Argon2 و به‌کارگیری مقادیر به اصطلاح Salt هَش می‌شوند که در آن یکسری مقادیر رندوم را ابتدا به پسورد کاربر اضافه کرده سپس مجموعۀ آن دو با هم هَش می‌شوند و همچنین مقادیر رندوم به ازای پسوردهای مختلف منحصربه‌فرد بوده و همین مسئله نیز تا حدودی منجر به تأمین امنیت اپلیکیشن می‌شود (Salt به معنی «نمک» یک عدد تصادفی است که به ازای هر کاربر توسط سیستم تولید شده و در دیتابیس ذخیره می‌گردد به طوری که یک لایهٔ امنیتی به اپلیکیشن اضافه می‌کند.)

آشنایی با قوانین Confusion و Diffusion در رمزنگاری
به طور کلی عملکرد الگوریتم‌های هَش، رمزنگاری و تولید اعداد تصادفی از اصول Shannon تحت عناوین Confusion و Diffusion پیروی می‌کنند که Confusion در رمزنگاری بدین معنی است که هر بیت تشکیل‌دهندۀ متن رمزگذاری‌شده در خروجی باید به قسمت‌های مختلفی از کلید و دیتای ورودی ربط داشته باشد به طوری که رابطۀ مابین دیتای ورودی، کلید و دیتای رمزگذاری‌شده به سادگی قابل‌تشخیص نباشد و Diffusion بدین معنی است که تغییر یک بیت در دیتای ورودی باید منجر به تغییر قابل‌توجهی در دیتای خروجی رمزگذاری‌شده شود (نیاز به توضیح است که این اصول در بسیاری از هَش فانکشن‌ها، الگوریتم‌های تولید اعداد تصادفی و الگوریتم‌های رمزنگاری متقارن و نامتقارن رعایت شده‌اند.)

نتیجه‌گیری
آنچه که مسلم است اینکه مطالب بیان‌شده در این مقاله صرفاً مروری کلی بر مفاهیم رمزنگاری بوده و به جزئیات الگوریتم‌ها و انواع روش‌های آن پرداخته نشده است و به منظور توسعۀ اپلیکیشن‌هایی امن و جلوگیری از انواع حملات ابتدا باید با چنین مفاهیم پایه‌ای در رمزنگاری آشنا بوده و سپس نحوۀ به‌کارگیری از لایبرری‌ها و فریمورک‌های رمزنگاری در زبان برنامه‌نویسی و پلتفرم مد نظر خود را بیاموزید.

همچنین به یاد داشته باشید که صرفاً کپی/پیست کردن یکسری کُد آماده از منابع مختلف ممکن است منجر به توسعۀ اپلیکیشن‌هایی ناامن گردد و از همین روی پس از درک مفاهیم پایه‌ای رمزنگاری، باید با مطالعهٔ مستندات الگوریتم‌های مد نظر خود، اطلاعات عمیقی در ارتباط با آن‌ها کسب نمایید.

منبع


اکرم امراه‌نژاد