در این مقاله میخوایم ببینیم pepper و salt در رمزنگاری چی هستن و تفاوت های بینشونو بررسی کنیم
بریم توی اشپزخونه و با فلفل و نمک یکم رمزنگاری کنیم 😁
در وهله اول این پیشنیاز رو بگم که پسورد ها باید به صورت هش ذخیره بشن که وقتی مهاجم به سیستم دسترسی گرفت نتونه پسورد رو راحت بخونه و بفهمه ، حالا یه مشکلی داریم ، اگر پسورد دوتا کاربر ها یکسان باشه و یه مهاجم بخواد هش هارو بفهمه و حمله کنه ، موقع Brute Force یکی از پسورد هارو بتونه کشف کنه، پسوردی که کشف شده برای دوتا کاربر هست و انگار دوتا پسورد دوتا کاربر درامده
برای مثال به این پسورد ها دقت کنید ، مثلا پسورد دوتا از کاربر ها اناناسه (Pineapple) و اون هش اگر موقع حمله در بیاد ، وقتی میبینن عه این هش دوبار تکرار شده میفهمن که دوتا پسورد یکسان بوده و انگار دوتا کاربر رو هک کردن
برای حل این مشکل Pepper اختراع شد ، Pepper یک مقداریه که در Application Code تعریف میشه و ثابته و بعد پسورد وارد میشه و موقع هش گرفتن از Pepper بعلاوه اون پسورد هش گرفته میشه
برای مثال ما اینجا عبارت "PT0s!NsO9" رو به عنوان Pepper داریم ، این عبارت مقدار ثابتیه و فایده ای که داره اینه که مهاجم وقتی میبینه که عه یه هش دوبار تکرار شده و میخواد با حملات Brute Force مقدار اون هشو در بیاره تا عبارت Pepper رو نداشته باشه نمیتونه ، یعنی مهاجم حتما باید عبارت Pepper رو داشته باشه تا با اون عبارت و پسورد بیاد حمله Brute Force رو انجام بده تا هش گرفته شده مطابق چیزی که میبینید در بیاد
چون عبارت Pepper یک عبارت ثابتیه ، اگر کشف بشه امنیت به خطر میفته ، پس چیکار کنیم ؟ میاییم و برای هر کاربر یه مقدار تصادفی انتخاب میکنیم که با اون هش گرفته بشه و این عبارت چون رندوم و تصادفی انتخاب میشه و یکسان نیست و از الگوی خاصی پیروی نمیکنه ، حدث زدن و پیدا کردنش غیر ممکنه ، اینجاست که Salt میاد وسط :
به عبارات بالا دقت کنید ، دوتا کاربر پسورد یکسان که عبارت "Pineapple" هست رو وارد کردن ، عبارت Pepper در پسوند امده و یه مقدار 12 کاراکتری تحت عنوان Salt وارد شده که برای هر کاربر متفاوته و رندومه ، حالا وقتی از Password + Pepper + Salt هش گرفته بشه احتمال کرک کردنش حتی ممکنه به 0 برسه (منظور اینه واسه کرک این عبارت باید 100 سال زمان صرف بشه)
- عبارتی که تحت عنوان Salt ساخته میشه کاملا رندوم و تصادفیه و حتی اگر یه کاربر بخواد پسورد خودشو تغییر بده باز عبارت Salt جدیدی براش تولید میشه و هیچ Salt ای یکسان نیست و الگریتم ساختش اصلا معلوم نیست
- اگر از عبارت Salt و Pepper استفاده بشه ، ما میتونیم اطمینان حاصل کنیم که پسورد اگر زیر 8 کارکترم باشه و از عبارات کوچیک بزرگ، سیمبول ، یا عدد هم داخلش استفاده نشده باشه ، حتما توی Salt و Pepper این عبارات تکرار شده و چون طول Salt و Pepper ای که ما استفاده کردیم 21 کاراکتره ، بعلاوه 8 کاراکتر پسورد میشه 29 کاراکتر و این عبارت پیدا کردنش غیر ممکنه ، پس استفاده از Salt و Pepper این تضمین رو میده که حداقل طول پسورد ما به اندازه مقدار Salt و Pepper و 8 رقم پسوده و کوتاه نیست و اگر پسورد مقادیر ساده ای داشته باشه وقتی با Pepper و Salt ترکیب میشه یه پسورد محکمی میشه که قابل پیشبینی و حدس نیست!
- اگر ما از Salt استفاده کنیم حتی اگر پسورد 1000 تا کاربر هم مثل هم باشن باز مقدار هش متفاوت میشه
پس به صورت خلاصه :
- Pepper : یک مقداریه که ثابته که در Application Code هست و این مقدار بعلاوه پسورد هش گرفته میشه که تا حد خیلی زیادی در برابر حملات Rainbow هش رو مقاوم میکنه
- Salt : یک مقدار رندوم و تصادفیه که توسط Application ساخته میشه و شامل حروف بزرگ و کوچیک ، عدد و سیمبوله که بعد Pepper معمولا میاد و هش رو دربرابر حملاتی که میشه مقاوم میکنه
با سلام
ممنونم آقای پزشکیان کاملا متوجه شدم
سلام
منظور از application code اینه ک برنامه نویس توی کدی که نوشته که سایتو طراحی کنه عبارت pepper رو قرار میده عبارت Application code دو قسمت میشه ، کد که میشه کد و application هم منظور Web Application هست ، یعنی برنامه نویس وقتی خواسته Backend سایتو بنویسه امده و در بخش احراز هویت و پسورد قابلیت pepper رو قرار داده و عبارت pepper رو هم قرار داده ! بعدا وقتی برنامه میاد و پسورد رو از کاربر میگیره میبینه عه باید با یه عبارت pepper ای اونو هش کنه و بعد هشش میکنه
مثلا اینجا نگا کنید این یه کد هست برای ثبت نام کاربر جدید ، در قسمت اول ما ایه کامنت داریم که میگه این صفحه ثبت نامه که هیچ
پایینش عبارت pepper تعریف شده که من مثل عکس مقاله عبارت "PT0s!NsO9" رو قرار دادم ، به این میگن قرار دادن در اپلیکیشن کد ، حالا پایین کد پی اچ پی ما شروع میشه ، میاد و مقدار پپر رو میگیره و میریزش تو $pepper ، بعد پسورد رو میگیره (از متد post که امن تره) و میریزش تو $pwd و پایین تر میاد و میگه که نوع الگریتم ذخیره سازیش چی باشه که اینجا sha256 عه ، و میاد و هش و پسورد رو ترکیب میکنه و میریزش تو متغییر $pwd_peppered و بعد میاد خود پسورد، و ترکیب پسورد و پپر رو با تابع password_hash هش میکنه (با الگریتم sha256) و میریزش تو متغییر $pwd_hashed و خط اخرم یوزر نیم رو بعلاوه پسورد هش شده میریزه تو دیتابیس
این از pepper و اینکه گفتید application code چیه ، حالا بریم salt
-----------------------------------------------------------------------------------------------
من نمیخواستم اینجا کد رو وسط بکشم ولی میکشم :)
مثال رو ببین :
# قبلش بگم که اینجا پپر نداریم
در وهله اول یه پسورد رو میریزه تو متغییر پسورد که اینه $password و در اینجا پسورد رو از کاربر نمیگیریم ، در این مثال عبارت "Test1234" فیکس و ثابته و رشتس ، اگر خواستید بگیرید که باید با متد خاص از کاربر پسوردو بگیرید و بریزید تو متغییر
حالا اینجا بجای اینکه salt رو ما مشخص کنیم میاییم از cost استفاده میکنیم که مقدار salt رو برای ما میسازه (من دیگه اینجا نمیخوام روش کار cost رو توضیح بدم ولی همینقدر بدونید که هرچی عدد بیشتر باشه سختی بیشتر میشه و به طبع سرعت کم میشه) ، حالا توی متغییر $option ما یه مقدار salt ساختیم
حالا میاییم و تو متغییر $hashed_password از پسورد با سالت ($options) و الگریتم BCRYPT هش میگیریم
و یوزر نیم و پسورد(هش شده رو) رو میریزیم تو دیتابیس
حالا یوزر نیم و پسورد چطوری نمایش داده میشن؟
حالا در اینجا ما بجز یوزرنیم 4 تا چیز داریم که از هم جدا شدن ، اولیا با "$" جدا میشن و اخری با نقطه "."
اولیش میشه الگریتم ، دومیش میشه اپشن هایی که داره الگریتم ، مقدار سالت میشه سومی و بعد با یه نقطه از پسورد هش شده جدا میشه
حالا یوزر نیم با این عبارت توی دیتابیس سیو میشه ، یعنی اون بالا محمد یوزر نیمشه و پایینم که مخلفاتش
حالا میرسیم به سوال شما
وقتی که شما در فرم لاگین یوزرنیم رو میزنید ، تابع password_verify میاد و اون یوزر نیمی که وارد میکنید و پسوردی که وارد میکنید رو میگیره ، میره توی بخشی که اون یوزرنیم ذخیره شده ، حالا میبینه اون هشی که ساخته براتون کدومه و بعد میاد پسوردتونو با اون سالت هش میگیره و با عبارت اخر مقایسه میکنه ، در این مثال وقتی شما یوزر نیم رو وارد میکنید "Mohammad" و پسورد رو تایپ میکنید مثلا "123" میاد و در دیتابیس میگرده سراغ entry ای به نام "Mohammad" بعد میاد و عبارت salt یا همون سبزه رو میبینه بعد میاد رمز "1234" رو با اون مقدار salt که سبزه رو باهم هش میگیره و با مقدار نارنجیه مقایسه میکنه و اگر یکی بود یعنی حله دیگ :)
با سلام
بسیار ممنونم از پست بسیار خوبتون
سوالی که برای من پیش میاد اینکه Application Code چیه؟
و یک سوال دیگه، من مثلا تو توسینسو ثبت نام کردم بعد پسوردم توسط Salt که ماهیت رندوم داره، هش و در دیتابیس ذخیره شده. حالا وقتی از سایت LogOut کنم و دوباره بخوام به عنوان شخص ثبت نام شده وارد شم باید پسوردمو تبدیل به هش کنه بعد مقایسه کنه ( چون هش بازگشت ناپذیره )حالا با وجود Slat چجوری میتونه پسورد منو (PainText) رو با هش توی دیتابیس مقایسه کنه؟
بله دقیقا حالا الگریتم های هشنگ دیگ هم هستن ک واقعا کندن و فرایند رو سخت تر میکنن منتها نفوذگرا که همیشه مستقیم به در قلعه که همه منتظرن حمله نمیکنن ک :)
خیلی ممنونم بابت زمانی که گذاشتین، موضوع رو کاملا درک کردم و متوجه شدم.
فکر میکنم به خاطر همین مکانیزم های امنیتی هست که کرک پسوردهای سیستمی سخت تر شده و مباحث تست نفوذ و هک بیشتر به سمت مهندسی اجتماعی و فیشینگ پیش میرند.
سلام خدمت شما
درباره تاریخچش باید توگوگل سرچ کنید معمولا چون اسم افراد به کار نمیاد ادم یادشون نمیگیره
والا اگر الگریتم رمزنگاری رو میگفتید، اون فرمول های پیچیده ریاضی داره ولی خب با مثال های ساده قابل اثباته
ولی بحث salt و pepper خیلی سادست ، شما اگر مفهوم هش رو بدونید و اون 4 تا قانون هش رو این مقاله رو درک میکنید
ما در بحث حملات rainbow و lookup میاییم و از یه لیستی هش میگیریم و با هش تارگت مقایسه میکنیم
pepper و salt یه مقدار اضافه هستن که وقتی بعلاوه اون پسورد ازشون هش گرفته بشه ، هش کلا عوض میشه و نمیشه پیدا شون کرد
به این مثال توجه کنید:
الان من یه پسورد دارم که اینطوریه :
در اینجا هکر فقط هش رو داره و اون عبارت و رمز اصلی رو نداره و میخواد پیدا کنه ، از اونجایی ک هش برگشت پذیر نیست باید یه لیست درست کنه که تمام عبارات رو ازشون هش بگیره و تست کنه
حالا یه هکر میاد و همچین لیستی رو اماده میکنه و ازشون هش میگیره که با هش تارگت مقایسه کنه
وقتی تست میکنه میبینه عه مقدار دوم هشش عین هش تارگته و میفهمه پسورد 1234 بوده !
حالا pepper که خوندید یه عبارت ثابته و salt یه مقدار رندومه ، مثلا این هشو ببینید :
الان هرچقدر لیست هکر دراز و قوی باشه بازم نمیتونه بفهمه چه رمزی بوده
ببینید رمز همون 1234 عه ولی ما یه عبارت pepper تحت عنوان "qwe" اضافه میکنیم و بعدش یه مقدار salt دیگم بهش اضافه میکنیم تحت عنوان "34@7sJ^g2" یعنی از این عبارت :
حالا شما از کجا میخوای بفهمی مقدار pepper چی بوده و مقدار salt چی بوده؟
اگر میگید خیلی راحته این عبارت رو پیدا کنید (راهنمایی : پسورد همونه ولی من فقط salt و pepper رو عوض میکنم)
سلام، مقاله خیلی خوبی بود.
یک سوال برام پیش اومده بود که متد Pepper و Salt رو چه کسی طراحی کرده ؟
منظورم اینه به چه صورتی هست یا به چه صورتی نوشته شده که الگو های اونارو برای طراحی رمز نمیتونند پیدا کنند ؟