03-22-2013, 10:45 PM
sonixax نوشته: من كدتون رو ندیدم چون روی پی سی نت ندارم فعلن ، فقط خواستم بدونم برای رمز نگاری كلمه عبور فقط به یك md5 خالی بسنده كرده اید یا salt هم بهش اضافه كردید ؟نه اتفاقا سیستم هش کلمهء عبور این برنامه هم یه داستانی داشت اندازهء تحقیقاتی که روی تابع رندومش کردم.
حتی میتونم بگم شما اگر اخیرا داستانهایی درمورد اهمیت و روشهای پیشرفتهء هش میشنوید در جامعهء برنامه نویسان داخلی، احتمالا بنیانگذار و مبلغ اولش بنده بودم!!
مثلا اون زمانی که بنده متد Key stretching رو کشف و مطرح کردم، ظاهرا کسی از بروبچ خودمون حتی از وجود چنین چیزی خبر نداشت. حداقل بصورت عمومی چیزی دیده نمیشد و اهمیتش مطرح نشده بود.
حتی درمورد یه مسائلی مثل اهمیت سالت رندوم مختلف به ازای هر پسورد هم اطلاعات تخصصی وجود نداشت و مثلا در فروم آشیانه فتوا داده بودن که در عمل بیخوده!! احتمالا بخاطر اینکه فکر میکردن روشهای هک و حمله فقط هموناست که دوتا هکر خیابانی مثل خودشون بلدن و انجام میدن!
بنده در تابع هش برنامم از SHA256 استفاده کردم؛ چون MD5 مدتهاست سوراخ شده؛ همچنین SHA1 هم دیگه منسوخه برای این کاربرد.
البته استفاده از اینا برای کاربرد هش اگر با بقیهء متدها ترکیب بشن اونقدرها هم ضعیف نیست، ولی بهرصورت اکیداً بهتره اجتناب بشه.
کلا 4 مسئلهء اساسی در هش پسورد هست که من با انبوهی تحقیقات به این خلاصه رسیدم:
- سالت ثابت (که معمولا در جایی غیر از دیتابیس ذخیره میشه)
این سالت یک رشتهء رندوم است که برای کل پسوردها یکسانه و استفاده میشه.
- سالت رندوم به ازای هر پسورد
این سالت در دیتابیس همراه هش پسورد ذخیره میشه.
- متد Key stretching
این متد یعنی تکرار عملیات هش پسورد همراه با سالت و اینها، به تعداد بالا (حداقل چند هزار بار).
- آخریش هم استفاده از الگوریتم های مخصوص هش مثل bcrypt و scrypt
این الگوریتم ها مخصوص هش طراحی شدن و مثلا Key stretching رو سرخود دارن. طوری طراحی شدن که حمله های کرک رو تاحداکثر ممکن سخت کنن.
scrypt جدیدتر و قویتره، ولی زیاد استفاده نمیشه؛ حتی bcrypt هم خیلی زیاد جا نیافتاده (ولی ظاهرا آمار قابل توجه داره).
scrypt حمله های سخت افزاری جدید رو هم بحساب آورده و هزینهء اونا رو به شدت زیاد کرده.
حالا من اومدم و الگوریتم هش خودم رو که این سه متد اول درش رعایت شده باشه خودم با SHA256 طراحی کردم، ولی اصولی تر و قوی ترش اینه که از bcrypt یا scrypt استفاده بشه. البته توجه کنید که مثلا سالت ثابت رو خودتون باید به ورودی bcrypt اضافه کنید.
من بخاطر اینکه دیدم ظاهرا الگوریتم bcrypt از نظر ساپورت در بعضی نسخه های مورد استفاده PHP ممکنه مشکل داشته باشه، ترجیح دادم ریسک نکنم. همون الگوریتم منم فکر میکنم برای بیشتر کاربردها کافی باشه! الان حتی برنامه های معروف و با سابقهء زیادی هستن که از الگوریتم های ضعیف تر از این استفاده میکنن. ضمنا کرکرها فکر نمیکنم هنوز به خودشون جرات و زحمت داده باشن که دنبال کرک روشهای پیچیده و جدیدتر برن؛ بخصوص که هنوز اهداف قدیمی و به مراتب راحتتری دارن.
راستی در تولید سالتها باید دقت بشه که:
1- از توابع رندوم امنیتی استفاده بشه.
2- تعداد حالتهای سالت بقدر کافی زیاد باشه (من ترجیح دادم ریسک نکنم و از 2 به توان 128 حالت که استاندارد رمزنگاریه استفاده کردم).