با گسترش فناوری اطلاعات و افزایش استفاده از اینترنت، سازمانها و شرکتهای بزرگ و کوچک اطلاعات و دادههای خود را بر روی بانکهای اطلاعاتی، سایتها و پرتالهای اینترنتی ذخیره و منتشر میکنند. بنابراین حفظ امنیت و محافظت از دادهها از اهمیت ویژهای برخوردار است.
رمزنگاری در زبان برنامهنویسی PHP فرایندی است که طی آن اطلاعات و دادهها با استفاده از الگوریتمهای رمزنگاری به یک رشته یا کد رمزشده تبدیل میشوند. هدف از رمزنگاری افزایش امنیت و محرمانگی دادهها است. الگوریتمهای متداول رمزنگاری بر اساس روشهای پیچیده ریاضی عمل میکنند و ورودی اولیه را به یک خروجی ظاهرا تصادفی و بیمعنا تبدیل میکنند. در PHP توابع و کلاسهایی برای پیادهسازی این الگوریتمها وجود دارد. با استفاده از آنها میتوان به راحتی عملیات رمزنگاری و رمزگشایی را در برنامههای PHP انجام داد، البته انتخاب الگوریتم مناسب و پیکربندی صحیح آنها نیز حائز اهمیت است. در این مقاله به بررسی الگوریتمهای رایج رمزنگاری در PHP میپردازیم.
انواع رمزنگاری پی اچ پی (php)
رمزنگاری در PHP به طور کلی به دو دسته اصلی تقسیم میشود:
- رمزنگاری متقارن (رمزنگاری کلید مخفی)
در این روش از یک کلید رمزنگاری برای رمز کردن و رمزگشایی استفاده میشود. الگوریتمهایی مانند AES، DES و Blowfish جز رمزنگاریهای متقارن هستند.
- رمزنگاری غیرمتقارن (رمزنگاری کلید عمومی)
در این روش از یک جفت کلید عمومی و خصوصی برای رمزنگاری و رمزگشایی استفاده میشود. الگوریتم RSA از انواع رمزنگاری غیرمتقارن است.
زبان PHP ابزارها و توابع لازم برای پیادهسازی انواع روشهای رمزنگاری و حفاظت از داده را در اختیار ما قرار میدهد. علاوه بر الگوریتمهای رمزنگاری، از روشهایی مانند هشکردن نیز میتوان برای محافظت از اطلاعات استفاده کرد. انتخاب نوع رمزنگاری و حفاظت از دادهها بستگی به نیازها و سطح امنیت مورد نیاز پروژه دارد. با توجه به اهمیت امنیت در توسعه نرمافزار، در ادامه قصد داریم انواع الگوریتمهای رمزنگاری و روشهای حفاظت از دادهها را تشریح کنیم.
۱- هش کردن
زبان PHP دارای توابع و امکانات گستردهای برای پیادهسازی انواع الگوریتمهای رمزنگاری و هشکردن اطلاعات است. یکی از کاربردهای کلیدی هشکردن، اعتبارسنجی گذرواژه کاربران است. به جای ذخیرهسازی گذرواژه به صورت متن ساده، میتوان مقدار هششده آن را در پایگاه داده ذخیره کرد. سپس در هنگام ورود کاربر، گذرواژه را هش و با مقدار ذخیرهشده مقایسه نمود.
تفاوت رمزنگاری و هش کردن
هش کردن و رمزنگاری دو روش متفاوت برای حفاظت از دادهها در PHP هستند. هشکردن یک فرآیند یکطرفه است که طی آن مقادیر ورودی با استفاده از الگوریتمهایی مانند MD5 و SHA1 به رشتههایی با طول ثابت تبدیل میشوند. هشکردن برای ذخیره اطلاعات حساس مانند گذرواژهها مفید است زیرا قابلیت بازگشت به مقدار اصلی را ندارد، اما انتخاب الگوریتمهای قدرتمند و کند مانند bcrypt برای هش گذرواژه حائز اهمیت است.
رمزنگاری یک فرآیند دو طرفه بوده و اطلاعات رمز شده را میتوان با داشتن کلید مناسب به حالت اولیه بازگرداند. رمزنگاری برای ذخیرهسازی یا انتقال امن دادههایی که نیاز به بازیابی دارند، مورد استفاده قرار میگیرد. توابع mcrypt و openssl در PHP برای رمزنگاری به کار میروند. در مجموع هر دو روش بسته به نوع کاربرد میتوانند مفید باشند. هشکردن برای ذخیره اطلاعات حساس و رمزنگاری برای انتقال امن دادهها کاربرد دارند.
توابع هش کردن در PHP
PHP دارای توابعی مانند md5 و sha1 است که برای هش رشتههای متنی به کار میروند. همچنین توابع پیشرفتهتری مانند hash_hmac وجود دارد که امکانات بیشتری را فراهم میکنند. در ادامه قصد داریم توضیحات کاملی در مورد توابع هش و رمزنگاری در PHP ارائه دهیم تا برنامهنویسان بتوانند بهترین الگوریتمها را برای نیازهای خود انتخاب کنند.
تابع md5
تابع md5 یکی از توابع هش کردن متداول در زبان برنامهنویسی PHP است که برای تبدیل یک رشته به یک عدد هش ۱۲۸ بیتی استفاده میشود. این تابع سادهترین روش برای هش کردن اطلاعات مانند گذرواژههاست، اما از آنجایی که خروجی ثابت و قابل پیشبینی دارد، امنیت چندان بالایی ندارد. با داشتن هش md5 یک رشته، میتوان با جستجو در جداول عظیم رمزگشایی، رشته اصلی مربوط به آن را پیدا کرد.
برای افزایش امنیت md5 میتوان از روشهایی مانند اضافه کردن یک رشته تصادفی به عنوان «نمک» استفاده کرد تا خروجی پیشبینیناپذیر شود، اما با وجود الگوریتمهای هش پیشرفتهتر مانند SHA256، استفاده از md5 دیگر توصیه نمیشود. زبان PHP از نسخه ۵ به بعد دارای توابع امنیتی قدرتمندتری مانند password_hash است که پیادهسازی بهینهشدهای از الگوریتمهای هش پیشرفته دارند و برای هش کردن گذرواژهها توصیه میشوند.
تابع crypt
تابع crypt در PHP یکی از توابع بسیار کارآمد برای هش کردن رشتهها و گذرواژههاست. این تابع نسبت به تابع md5 از امنیت بالاتری برخوردار است، زیرا به صورت خودکار یک رشته تصادفی به عنوان «نمک» (salt) به دادههای ورودی اضافه میکند تا خروجی هش غیرقابل پیشبینی شود.
در نسخههای PHP ۵ به بالا، تابع crypt به صورت دو پارامتری قابل استفاده است، به این ترتیب که پارامتر اول رشتهای است که قرار است هش شود و پارامتر دوم همان نمک است. با این روش میتوان نمک را به صورت دلخواه تعیین کرد تا امنیت بیشتر شود، اما در نسخههای قدیمیتر PHP، تنها یک پارامتر قابل ارسال است و تابع خودش به طور خودکار نمک را تولید میکند. بنابراین در آن نسخهها امکان تعیین دلخواه نمک وجود ندارد.
به طور کلی تابع crypt با الگوریتم پیچیدهتر و افزودن نمک تصادفی، گزینه مناسبی برای هش اطلاعات حساس محسوب میشود.
تابع password_hash
هشکردن برای مواردی مانند ذخیره گذرواژهها و تایید هویت کاربران مناسب است، اما رمزنگاری مانند توابع mcrypt_encrypt و openssl یک فرآیند دوطرفه است و دادههای رمزشده را میتوان با داشتن کلید مناسب به حالت اولیه برگرداند. پس رمزنگاری زمانی مفید است که نیاز به بازیابی دادهها وجود دارد. در نتیجه انتخاب بین هش و رمزنگاری بستگی به نوع کاربرد و نیاز به برگشتپذیری دادهها دارد. هش برای ذخیره اطلاعات حساس و رمزنگاری برای ارتباطات و انتقال امن دادهها مورد استفاده قرار میگیرد.
تابع base64_decode
تابع base64_encode و base64_decode از جمله توابع ساده و مفید برای رمزنگاری دادهها در زبان PHP هستند. تابع base64_encode یک رشته متنی را به فرمت base64 که یک نوع رمزنگاری است، تبدیل میکند. خروجی این تابع یک رشته ظاهرا بیمعنی است که حاوی کاراکترهای الفبایی، عددی و دو کاراکتر خاص + و / است.
برای بازگرداندن رشته رمز شده به حالت اولیه، از تابع معکوس آن یعنی base64_decode استفاده میشود. این تابع رشته رمز شده را دریافت و آن را به رشته اصلی تبدیل میکند. این دو تابع به دلیل سادگی پیادهسازی، از امنیت پایینی برخوردارند و بیشتر برای رمزنگاری سبک و انتقال ایمن دادهها کاربرد دارند. برای رمزنگاری قویتر باید از الگوریتمهای پیچیدهتر استفاده کرد.
تابع mcrypt_encrypt
تابع mcrypt_encrypt در زبان برنامهنویسی PHP یکی از پرکاربردترین توابع برای رمزنگاری دادهها به شمار میرود. این تابع با استفاده از الگوریتمهای رمزنگاری متقارن مانند CRYPT_BLOWFISH، یک رشته متنی را بر اساس کلید تعریف شده، رمزنگاری کرده و خروجی رمزشده را برمیگرداند.
مزیت اصلی این تابع پشتیبانی از الگوریتمهای قدرتمند رمزنگاری و همچنین عملکرد بالای آن است. خروجی حاصل از mcrypt_encrypt را میتوان با استفاده از تابع mcrypt_decrypt و کلید مشابه، مجددا به رشته اصلی بازگرداند.
۲- رمزنگاری کلید مخفی
رمزنگاری کلید مخفی یکی از رایجترین انواع رمزنگاری در PHP است که از یک کلید مخفی برای رمزنگاری و رمزگشایی استفاده میکند. در این روش ابتدا باید یک کلید تصادفی با استفاده از توابعی مانند random bytes تولید کرد که باید محرمانه نگه داشته شود. سپس با استفاده از توابعی مثل sodium crypto secretbox میتوان متن اصلی را با کلید مخفی و یک مقدار تصادفی به نام نانس رمزنگاری کرد.
خروجی رمز شده باید همراه با نانس به صورت یک رشته ذخیره شود تا بتوان آن را بازگشایی کرد. در هنگام رمزگشایی ابتدا نانس استخراج میشود و سپس با استفاده از تابع معکوس و کلید اصلی، متن رمز شده بازیابی میگردد. این روش از امنیت بالایی برخوردار است و برای ذخیرهسازی اطلاعات حساس که نیاز به بازیابی دارند، مفید است. البته نکته مهم حفظ محرمانگی کلید رمزنگاری است.
۳- رمزگذاری پاکت
رمزنگاری پاکت یک روش امن برای رمزنگاری دادهها در PHP است که به محافظت بیشتر در برابر دسترسی غیرمجاز کمک میکند. در این روش برای هر بار رمزنگاری، یک کلید رمزنگاری دادهها (DEK) به صورت تصادفی تولید میشود. این کلید برای رمز کردن دادههای اصلی به کار میرود.
سپس DEK خودش با استفاده از یک کلید اصلیِ مخفیتر (KEK) که در ابر نگهداری میشود، رمزنگاری میگردد. در نهایت KEK رمز شده در کنار دادههای رمزشده ذخیره میشود. با این روش اگر KEK هم مخفی بماند، دسترسی غیرمجاز به دادهها بسیار سخت میشود. البته مدیریت کلیدها باید به درستی انجام شود. رمزنگاری پاکت گزینه مناسبی برای ذخیرهسازی اطلاعات بسیار حساس است.
جمع بندی
در این مقاله به بررسی انواع روشهای رمزنگاری و حفاظت از دادهها در زبان برنامهنویسی PHP پرداخته شد. ابتدا انواع رمزنگاری شامل متقارن و غیرمتقارن و همچنین روشهایی مانند هشکردن معرفی شدند. سپس الگوریتمها و توابع مختلفی برای پیادهسازی هر یک از این روشها در PHP تشریح گردید.
در بخش بعدی به تفصیل در مورد توابع هشکردن و نحوه استفاده از آنها بحث شد. همچنین توابع مختلف رمزنگاری و توابع base64 مورد بررسی قرار گرفتند. در مجموع دیدیم که زبان PHP ابزارهای قدرتمندی برای پیادهسازی انواع روشهای حفاظت از دادهها فراهم میکند. انتخاب روش مناسب بستگی به نیاز پروژه و سطح حساسیت دادهها دارد.