• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
یک روش هش پسورد حرفه ای
#1
مجبور میشم قسمتهایی از پروژهء رجیستر و لاگین امنیتی خودم رو بصورت مجزا قرار بدم، چون واقعا مفید هستن و بعضی ها هم سوالهایی میپرسن و درخواست روش میکنن. الان این تاپیک رو هم بخاطر درخواست یک نفر که در پست خصوصی روش هش کردن پسورد رو خواسته بود ایجاد کردم. چون در پست خصوصی نمیشه فایل ضمیمه کرد، و نمایش کدهای فروم هم که کدها رو خراب میکنه.

بهرصورت همه میتونن از این روش واقعا قوی هش کردن استفاده کنن.

تعریف توابع:

کدها بخاطر مشکل تگ کد فروم در نمایش حذف شد.

مثال استفاده:

کدها بخاطر مشکل تگ کد فروم در نمایش حذف شد.

فایلهای مرتبط ضمیمه شدن.

توجه کنید که برای امنیت حداکثری، باید یک مقدار جدید برای متغییر pepper ست کنید. مقدارش باید 22 کاراکتر رندوم از اعداد و حروف بزرگ و کوچک باشه. این متغییر که در کد ذخیره شده و نه در دیتابیس، باعث میشه که اگر دیتابیس رو زدن ولی به کد منبع دسترسی پیدا نکردن، به هیچ وجه نتونن هش ها رو کرک کنن.

متغییر secure_hash_rounds هم تعداد دورهای استفاده شده برای Key stretching رو تعیین میکنه. البته تعداد واقعی دورها برابر 2 به توان secure_hash_rounds است.
معمولا مقدار secure_hash_rounds رو باید روی عددی قرار بدید که زمان صرف شده برای عملیات هش کردن مثلا یک دهم یا چند دهم ثانیه باشه. هرچی این زمان بیشتر باشه امنیت هش بیشتره. ولی اگر سرور و سایت شما ترافیک سنگینی داره میتونید مقدار secure_hash_rounds رو کمتر کنید که عملیات هش زمان کمتری صرف کنه. همیشه طوری تنظیم کنید که حداکثری باشه که بنظرتون مشکل پرفورمنس جدی ایجاد نمیکنه. منظورم از مشکل پرفورمنس مشکل واقعی است، یعنی در عمل مشکل دیده بشه، نه اونی که اغلب توی خیالات افراد هست و برای 1 میلی ثانیه هم خودشون رو میکشن! (بیماری وسواس در بهینه سازی!!)
بهرصورت ترافیک در بخش رجیستر و لاگین سایتها اغلب کسر کوچکی از کل ترافیک سایت است و بنابراین نباید در بیشتر موارد هیچ مشکلی با این قضیه وجود داشته باشه.

راستی خروجی تابع هش امنیتی ما یک رشتهء باینری 51 بایتی است که بنابراین باید در دیتابیس براش یک فیلد مثلا varbinary(51) تعریف کنید.

ضمنا حتما دقت کردید که بخش اول فایل secure_hash.php یک تابع رندوم امنه (که اخیرا در تاپیک دیگری ارائه کرده بودمش). تابع create_secure_hash تابع رندوم امن رو برای تولید salt نیاز داره.

البته باید بگم الگوریتمهای خفن تر از اینم وجود دارن، ولی اونا چون یه مقدار مشکلات ساپورت ممکنه بربخوریم بعضی جاها (من حداقل یک مورد دیدم) یا اینکه باید خودمون تحقیق و پیاده سازی کنیم، ترجیح دادم از روش ساده تری استفاده کنم. بنظر بنده امنیت همین روش هم برای کاربردهای عادی به حد کافی بالاست. خلاصه زیاد هم نباید گیر داد. بخصوص که امنیت بقیهء بخشهای سیستم هم معمولا بالاتر از این حد استاندارد نیست. این الگوریتم که ارائه شده صدها برابر روشهای درپیت و اختراعی شخصی که اکثرا ارائه میشه امنیت داره، چون بر اساس موارد پیشرفته علم رمزنگاری تهیه شده. سالت رندوم به ازای هر پسورد داره، سالت ثابت در کد (pepper) داره، و از متد Key stretching هم استفاده میکنه، ضمنا از SHA256 بعنوان الگوریتم هش پایه استفاده میکنه.


فایل‌های پیوست
.zip   secure_hash.zip (اندازه 2.37 KB / تعداد دانلود: 44)
  پاسخ
تشکر شده توسط : Reza ali786 admin ahora Hamid
#2
سلام من از این تابع شما در پروژه ی ورک شاپم استفاده کردم .
اما یه پیشنهاد ، بهتره بصورت یک کلاس ارائه اش بدید تا منسجمتر و شکیلتر باشه .

راستی یه نگاهی هم به این بنداز http://www.openwall.com/phpass/
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : admin ahora
#3
(۱۳۹۱ تير ۰۸, ۰۲:۵۲ ب.ظ)Reza نوشته: راستی یه نگاهی هم به این بنداز http://www.openwall.com/phpass/
اینو قبلا دیده و بررسی کرده بودم.
اتفاقا در روشی که خودم نوشتم ازش ایده گرفتم.
phpass یخورده زیادی شلوغه و میخواد همه چیز رو ساپورت کنه، و از اون طرف worst case به md5 عقب نشینی میکنی (البته md5 خام و خالی نیستا؛ سالت رندوم و Key stretching داره).
خلاصه من خواستم الگوریتمم ساده و روشن باشه و از md5 هم استفاده نکنم.
ضمنا phpass به تنهایی سالت ثابت نداره ها. اگر خواستید باید خودتون به ورودیش اضافه کنید.
  پاسخ
تشکر شده توسط : Reza


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان