امنیت در php – پسووردها

بعد از اینکه در اموزش قبلی نکات امنیتی PHP در فرم ها رو بررسی کردیم , جا داره راجب روش های ذخیره پسووردها و نیز تامین امنیت پسووردها نیز صحبت کنیم.

پسوورد چیه؟ پسوورد الگو یا رشته ای از کاراکترها هست که به شما اجازه ی دسترسی به یک بخش یا کامپیوتر یا سیستم رو میده 😀

توی صفحات وب پسوورد ها رو معمولا با استفاده از فرم ها دریافت میکنیم. اما میشه فرم هایی طراحی کرد که بشه پسوورد رو مثل پترن های گوشی موبایل دریافت کرد 😀

نکته : وقتی که دارید پسوورد رو از فرم دریافت میکنید , اگه برای دریافت پسوورد از input استفاده میکنید باید type اون رو به صورت password بنویسید تا اولا پسوورد موقع تایپ شدن دیده نشه! دوما روبات یا چیزی روی مرورگر نتونه مقدار داخل input رو بخونه!

بعد از اینکه پسوورد رو دریافت کردیم لازم داریم تا اون رو جایی ذخیره کنیم. اگه ما پسوورد خودمون رو جایی ذخیره کنیم امکان داره که پسوورد توسط کسانی که به سرور یا هاست ما دسترسی دارند لو بره ( مثلا مسئولی سرور بیاد کنجکاو بشه و به پسوورد ما یه نگاهی بندازه :-D).

برای جلوگیری از لو رفتن پسوورد اون رو باید تبدیل به رمز کنیم (رمزگذاری کنیم) , به رمزگزاری اصطلاحا هش کردن یا hash میگن. شما یا باید خودتون یک سری دستورات رمزگذاری بسازید یا اینکه از دستوراتی که موجود هستند استفاده کنید.

توابع موجود در PHP برای رمزگذاری به صورت زیر هستند: (چندتا از معروفاش رو براتون نوشتم , نیازی نیست همه رو بدونید! بعضیاش بدرد نخوره!)

  1. تابع هش کردن md5
  2. تابع هش کردن Crc32
  3. تابع هش کردن sha1
  4. تابع هش کردن sha256
  5. تابع هش کردن sha512
  6. تابع هش کردن Crypt

خب بیاید حالا یه پسوورد رو هش کنیم ببینیم این هش اصلا چیکار میکنه , من در مثال زیر عدد ۱۲۳۴۵۶۷۸۹ رو به عنوان رمز خودم در نظر میگیرم و میام اون رو هش میکنم ,طریقه ی استفاده از هر تابع و مقداری که با استفاه از هش تولید میشه رو براتون نوشتم تا بتونید ببینید:

در مثال بالا من عدد ۱۲۳۴۵۶۷۸۹ رو به عنوان رمز خودم در نظر گرفتم و اون رو با توابعی که معرفی کرده بودم هش کردم! مقداری که بعد از هش کردن تولید میشه رو زیر هرکدوم از توابع هش کننده به صورت کامنت شده(توی php با استفاده از // میتونیم کامنت یا توضیح ایجاد کنیم) براتون گذاشتم.

همونطور که میبینید تابع crc32 یه متن رو به عدد هش میکنه , این یعنی اینکه شما هرچی بهش بدید بهتون عدد میده 😀 , روش های هش کردن تفاوت هایی دارن که تفاوت هاشون رو میشه به صورت زیر لیست کرد:

  1. سرعت در هش کردن (تابعی که زود هش کنه خوب نیست! تابعی که خیلی دیر هش کنه هم خوب نیست!)

  2. تنوع استفاده از کاراکتر ها در هش کردن (تابعی که فقط عددی هش کنه خوب نیست! تابعی هم که فقط کاراکتری هش کنه خوب نیست! باید مقدار خروجی هم توش عدد باشه هم توش رشته باشه , خلاصه بگم هرچی سخت تر باشه بهتره)

  3. طول متن خروجی بعد از هش شدن ( طول متنی که هش شده هرچی بیشتر باشه بهتره! یعنی سخت تره که حدس بزنید متن اصلی قبل از هش شدن چی بوده!).

خب پس تا اینجا با تفاوت الگوریتم های هش اشنا شدید. اگه پسوورد خودتون رو فقط هش کنید و ذخیره کنید مطمئن باشید بازم امن نیست! میشه مقدار هش شده رو کپی کرد و توی گوگل یه جستجو کرد تا مقدار پسوورد پیدا بشه!

برای ذخیره کردن پسوورد به صورت امن شما نیاز دارید تا یک تکنیک به کار ببرید! شما باید یک متن به صورت تصادفی تولید کنید و اون متن رو به پسوورد خودتون اظافه کنید و بعدش پسوورد رو هش کنید. به این متن تصادفی salt یا نمک میگن. به مثال زیر دقت کنید:

در مثال بالا من یه تابع نوشتم که متن تصادفی تولید میکنه و بعدش متنی که به صورت تصادفی تولید شده رو با پسوورد خودم قاطی کردم و هش کردم 😀 حالا اگه کسی حتی مقدار هش شده ی پسوورد من رو هم داشته باشه خیلی سخت تر میتونه پسوورد اصلی رو بدست بیاره!

نکته : هنگامی که از هش و salt (نمک) استفاده میکنید شما باید هم هش رو ذخیره کنید و هم نمک رو! چون برای دفعه های بعد که کاربر میاد و پسوورد رو میزنه باید دوباره با همون salt قبلی پسوورد رو هش کنید (تابع هش هم باید همون قبلی باشه) و با پسووردی که هش شده دارید مقایسه کنید , اگه دوتا یکسان بودن به کاربر اجازه ی دسترسی بدید.

برای تولید salt یا نمک روش های مختلفی وجود داره , میشه با توابع rand یا mt_rand عدد تصادفی تولید کرد و به عنوان hash استفاده کرد! اما حدس زدن چیزی که با rand و یا mt_rand تولید میشه برای هکر ها راحته! ما باید از یه الگوریتم پیچیده تر استفاده کنیم 😀 من در اینجا تابع openssl_random_pseudo_bytes رو به شما معرفی میکنم که میشه به صورت زیر استفاده کرد:

امیدوارم که این اموزش بدرد دوستان خورده باشه و بتونید پسووردهای خودتون رو به صورت امن تر ذخیره کنید. اگه دوستان نکته یا سوالی دارن میتونن از بخش نظرات پایین همین پست مطرح کنند.

به اشتراک بگذارید:Email this to someoneShare on FacebookTweet about this on TwitterShare on Google+Digg thisShare on LinkedInPin on PinterestShare on StumbleUponFlattr the authorShare on RedditBuffer this pageShare on TumblrPrint this pageShare on YummlyShare on VK
  1. امیر.م

    خیلی ممنون
    عالی بود
    اگه ممکنه یه مطلب درباره ارتباط وب با وبکم ( مثلا با html5 و . . . ) در سایت قرار بدید

  2. شیدا.ر

    سلام ممنون بابات مطلب خوبتون
    یک مطلبی هم درباره نصب و راه اندازی ادیتور در سایت های php قرار بدید

    • سلام بر شما. منظورتون از ادیتور چه نوع ادیتوری هست؟ ادیتور هایی که معمولا برای پست گذاشتن استفاده میکنیم؟ مثلا باهاش متن رو bold میکنیم , یا ادیتور هایی که برنامه نویسی میکنیم توش و فایل های کدنویسی خودمون رو ویرایش میکنیم؟ نوعش رو مشخص کنید تا یه آموزش راجب نحوه ی استفاده ازشون بزاریم.

      • شیدا.ر

        هردوشونو اگه بزارید ممنون میشم چون واقعا کارم لنگ همیناست.
        البته من از هیچ cms استفاده نمیکنم میخوام روی cms خودم بزارمشون
        ممنون دوست عزیز

        • در چند روز اینده در مورد ادیتورها و نحوه ی افزودن آنها به cms های شخصی که خودتون برنامه نویسیش رو انجام دادید پست خواهم گذاشت. بازم اگه مواردی نیاز داشتید میتونید درخواست بدید تا پست بزاریم راجبش 😀 ممنون از پیشنهاد خوبتون.

  3. وقتی salt رو کنار پسورد یا ی جای دیگه ذخیره کنیم! مگه هکر نمی‌تونه اونو هم ببینه؟! به هرحال کسی که به دیتابیس پسورد دسترسی داره خب salt رو هم می‌بینه دیگه! با این کار فقط زمان بیشتری نیاز داره ولی غیر ممکن نیست.

    • ما پسوورد رو با salt قاطی میکنیم و بعدش هش میکنیمش. حالا اگه هکر بتونه پسوورد ما رو از هش خارج کنه باید Salt رو هم داشته باشه که کار رو سخت تر میکنه! خب حالا اگه به دیتابیس دسترسی داشته باشه چی؟ بازم ما وقتی که salt با پسوورد قاطی بشه طول پسوورد افزایش پیدا میکنه که کار سخت تر میشه!

  4. سلام
    درصورت امکان در مورد ajax هم مطلب و آموزش بذارید؟؟؟؟ با تشکر

    • در مورد ایجکس در چند روز آینده پست خواهیم گذاشت و یک نمونه مثال براتون میزاریم 😀 بازم اگه پیشنهادی بود بگید حتما استقبال میکنیم

می‌خواهید دیدگاهتان را بیان کنید؟