یکی از شیوههای امنیتی برای حفاظت از اطلاعات شخصی کاربران، نگهداری رمزهای آنان به صورت کدشده است. در گذشته الگوریتمهایی مانند md5 و sha1 برای این منظور استفاده میشدند.
با افزایش سرعت و قدرت سختافزارها، این الگوریتمها جای خود را به الگوریتمهایی پیچیدهتر دادند تا امکان بازیابی رمزها با استفاده از آزمون و خطا دشوارتر از گذشته شود.
در فریمورک لاراول به صورت پیشفرض از الگوریتم Bcrypt استفاده میشود که الگوریتمی ایمن و با توجه به قدرت سختافزارهای امروزی، تقریبا غیرقابل بازیابی است.
دستیابی به این امنیت بالا، معایبی نیز در کنار خود دارد. یکی از این معایب، هنگامی است که میخواهیم، فهرستی طولانی از کاربران را در بانک اطلاعاتی ذخیره کنید و رمزهای هر کاربر را نیز با استفاده از الگوریتم سنگین Bcrypt کدگذاری یا Hash کنیم.
چنانچه تعداد کاربران به حدود چند هزار کاربر برسد، به احتمال زیاد با خطاهای timeout و بار سنگین روی سرور متوقف خواهیم شد.
در ادامه قصد داریم یک راه حل برای این مشکل معرفی کنیم که علاوه بر افزایش سرعت، امنیت کاربران را نیز در خطر قرار ندهیم.
برای حل مشکل بالا، در هنگام رمزگزاری گذرواژهها، به جای استفاده از الگوریتم Bcrypt از الگوریتم قدیمی sha1 که سرعت زیادی دارد و نسبت به md5 نیز امنیت بیشتری برای ما فراهم میکند استفاده میکنیم.
پس از انجام این کار لازم است تا در بخش ورود به سایت نیز تغییراتی اعمال کنیم. چنانچه ورود کاربر موفقیتآمیز نباشد، این احتمال وجود دارد که رمز او هنوز به Bcrypt تبدیل نشده باشد. بنابراین، یک مرحله به الگوریتم قبلی اضافه میکنیم تا در صورت عدم موفقیت ورود، رمز کاربر به صورت sha1 نیز با پایگاه داده مقایسه شود، این کار با یک Query ساده قابل انجام است. چنانچه این مرحله با موفقیت به انجام برسد، رمز دریافت شده از کاربر با الگوریتم Bcrypt کد میشود و به جای sha1 قبلی ذخیره میشود.
مرحلهی بعدی نیز تلاش مجدد برای ورود به سایت با الگوریتم Bcrypt خواهد بود که این بار به درستی انجام خواهد شد.
با این روش، بار سنگین پردازش Bcrypt به اولین ورود کاربر موکول میشود.
روشهای دیگری نیز برای انجام این کار وجود دارد که هر یک مزایا و معایب خود را دارند. روش فوق یکی از بهترین روشها است که برای کاربران و برنامهنویسان سایت کمترین مشکل را ایجاد میکند.