14
تشکر

چگونه با امنیت یک پسورد را ذخیره کنیم؟

Hash

Hash

در مطلبی در گذشته با عنوان آموزش هش(Hash) کردن پسورد در PHP انواع روش های هش کردن پسورد را بیان کردیم که الگوریتم های گفته شده علاوه بر زبان PHP در زبان های دیگر نیز قابل استفاده هستند. الگوریتم های معمول شامل md5, sha128, sha256, sha512, bcrypt و به همراه تکنیک salt است. اما از کدام الگوریتم برای ذخیره پسورد استفاده کنیم؟ مطمئنا جواب ما BCrypt است. اما چرا؟

در ادامه مطلب همراه ما باشید…

توابع ایجاد هش، برای محاسبه حجم زیادی از داده در حداقل زمان ممکن طراحی شده اند، پس به این معنی است که استفاده از آن‌ها برای ذخیره رمز عبور کار بیهوده‌ای است.

سرورهای مدرن میتوانند در هر ثانیه 330MB از حجم داده هش شده توسط MD5 را محاسبه کنند. اگر رمز عبور شما بوسیله MD5 ذخیره شده است و فقط از حروف کوچک به همراه اعداد و طول 6 کاراکتر باشد، میتوان رمز عبور احتمالی را در هر 40 ثانیه حدس زد، و اینکار بدون هیچ هزینه ای انجام میشود.

اما اگر کمی هزنیه انجام دهید و یک سوپر کامپیوتر کلاستر (Supercomputer cluster) ایجاد کنید، میتوانید حدود 700 میلیون پسورد را در هر ثانیه امتحان کنید، که به این معناست که میتوان پسوردهای احتمالی را در کمتر از یک ثانیه حدس زد.

استفاده از Salt هم کمکی نمیکند. شما از هر Saltیی که استفاده کنید، چه کوچک باشد، چه بزرگ باز هم حمله کننده میتواند پسوردهای احتمالی را به روش‌های بالا حدس بزند.

استفاده از bcrypt

خب چگونه bcrypt قرار است امنیت را برای ما بیاورد؟ bcrypt آهسته عمل میکند.

Bcrypt از الگوریتم رمزنگاری Blowfish استفاده میکند و بدلیل سرعت پایین آن در رمزنگاری میتواند انتخاب خوبی برای ذخیره پسوردها در دیتابیس باشد. رمزنگاری در bcrypt دارای یک مشخصه به نام work factor است که بسته به انتخاب آن میتوان زمان هش شدن یک پسورد را طولانی کرد.

برای مثال این تابعی است که ما در مطلب گذشته برای استفاده از bcrypt گفتیم. در این تابع work factor در عدد 11 است.

function generateHash($password){
    if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){
        $salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22);
        return crypt($password,$salt);
    }
}

اگر شما عدد 11 را به عددهایی بالاتر از 16 تغییر دهید، خواهید دید که محاسبه آن خیلی بیشتر طول میکشد. البته به یاد داشته باشید که شما باید عددی را انتخاب کنید که با سرور شما هماهنگی داشته باشد. Joseph در سایت خودش تست هایی (Benchmarks) را که از bcrypt با work factorهای مختلف امتحان کرده است گذاشته است، در این سایت میبینید که برای مثال اگر work factor در شماره 16 باشد، محاسبه آن حدود 5 ثانیه طول میکشد که البته در کامپیوترهای مختلف متفاوت است.

در تست دیگری که انجام شده است، اگر work factor در عدد 12 باشد، محاسبه عبارت yaaa حدود 3 میلی ثانیه طول میکشد در حالی که MD5 آن را در کمتر از یک میکروثانیه محاسبه میکند.

Bcrypt به شما امکان انتخاب بین سرعت و امنیت را میدهد و شما میتوانید با توجه به ویژگی‌های سرور خود به یک عدد متعادل برسید، تا به این صورت پسورد های شما به جای حدس زدن در هر 40 ثانیه در هر چندین سال یکبار حدس زده شوند.

  • fittachi می‌گه:

    ببخشید من توی بخش bcrypt مشکل دارم
    من فهمیدم که چطور پسورد ها رو هش و زخیره کنیم اما نفهمیدم حالا چطور اونا رو مقایسه کنیم در حالی که salt رو نداریم

  • amentaheir می‌گه:

    سلام ببخشید کدام روش برای هش کردم مناسب است درضمنا از pdo برای اتصال به دیتابیس استفاده می کنم

    روش اول hash(md5(password))l

    روش دوم “md5($Value) .”sdfsffdf55

  • ممنون. امکان اشتراک در شبکه اجتماعی رو هم برای پست ها قرار بدید لطفا

  • zanyar می‌گه:

    با سلام به نظر شما اگه تعداد کاربرای ثبت نامی در سایت در یک زمان خاص تعداد زیادی باشه با این روش فشار زیادی به سرور نمیاد؟
    ایا این راه حمله های تحت سرور رو بیشتر نمیکنه؟

    • محسن شفیعی می‌گه:

      اگر شما work factor رو بالا بگیرید، خب طبیعی به نظر میرسه. باید با توجه به مشخصات سرور به یک عدد مناسب برسید.
      این روش چطور حمله های تحت سرور رو بیشتر میکنه؟


  • نظرات این مطلب بسته است.