چگونه به شکل امن گذرواژه‌ها را ذخیره کنیم؟

جواب خلاصه: از bcrypt استفاده کنید.

چرا از MD5، SHA-1، SHA256، SHA512، SHA-3 و ... استفاده نکنیم؟

تمام الگوریتم‌های نامبرده، توابع هش ِ (به انگلیسی: hash function) همه‌منظوره هستند که طراحی شده‌اند تا حجم عظیمی از داده‌ها را در کم‌ترین زمان ممکن خلاصه‌سازی کنند. [مترجم: به طور مثال، یک رشته‌ی متنی بزرگ را به متنی کوچک تبدیل کنند]. این بدین معناست که این الگوریتم‌ها برای اطمینان از صحت داده‌ها عالی و برای ذخیره‌ی گذرواژه کاملا بدردنخور هستند.

یک سرور مدرن، توانایی هش‌کردن ۳۳۰مگابایت داده را در هر ثانیه، توسط الگوریتم MD5 دارد. اگر کاربران شما گذرواژه‌هایی دارند که همه به حروف کوچکند، از حروف و ارقام تشکیل شده‌اند و طولشان ۶ است، شما به راحتی می‌توانید تمام رمز‌های عبور ممکن (با مشخصات گفته‌شده) را در چیزی حدود ۴۰ ثانیه امتحان کنید.

و این حتی بدون خرج کردن یک قِران است!

اگر توانایی خرج کردن ۲۰۰ دلار آمریکا و استفاده از CUDA برای یک الی دو هفته را داشته باشید، می‌توانید سوپر کامپیوتر کوچکی برای خود فراهم کنید که توانایی امتحان کردن چیزی درحدود ۷۰۰٫۰۰۰٫۰۰۰ گذرواژه در ثانیه را دارد. و با این توان، شما می‌توانید رمز‌های عبور با شرایطی که قبلا گفتیم را نه هر ۴۰ ثانیه بلکه در هر ثانیه بشکنید!

سالت‌ها (به انگلیسی: salt) به شما کمکی نخواهند کرد

توجه به این نکته مهم است که بدانید، saltها برای جلوگیری از حمله‌های لغت‌نامه‌ای (به انگلیسی: dictionary attack) و حملات بروت فورس‌ (به انگلیسی: brute-force attack) کاملا بدردنخورند. با این فرض که مهاجم salt و هش ِ دیتابیس شما را دارد، حتی اگر saltهای بسیار بزرگ هم استفاده کنید، کماکان تاثیری روی این موضوع که مهاجم با چه سرعتی توانایی تست کردن گذرواژه‌های کاندیدا را دارد، نخواهد گذاشت.

با salt یا بدون salt، اگر شما از یک تابع هش ِ همه‌منظوره، که برای سرعت طراحی شده، استفاده کنید، به دردسر بزرگی افتاده‌اید.

بیکریپت مشکل را حل می‌کند

چگونه؟ به زبان ساده، فوق‌العاده کند است. bcrpyt از نوعی از الگوریتم Blowfish استفاده می‌کند و چیزی به نام ضریب کار را معرفی می‌کند که این امکان را می‌دهد تا بتوان تعیین کرد که تابع هش تا چه اندازه هزینه‌بر باشد. به همین دلیل bcrypt می‌تواند پابه‌پای قانون مور پیش برود. هرچه کامپیوتر‌ها سریع‌تر می‌شوند شما می‌توانید ضریب کار را زیادتر کنید و بدین‌ترتیب هش‌کردن نیز کندتر خواهد شد.

به طور مثال، bcrypt چقدر از MD5 کند‌تر است؟ به ضریب کار بستگی دارد. با ضریب کار ۱۲، bcrypt گذرواژه‌ی yaaa را روی لپ‌تاپ من در ۰.۳ ثانیه هش می‌کند. در سوی دیگر، MD5 همین کار را در کمتر از یک میکروثانیه انجام می‌دهد.

پس درمورد چیزی با مرتبه‌ی ۵ (۱۰ به توان ۵) برابر کندتر صحبت می‌کنیم. یعنی به جای شکستن هر گذرواژه تنها در ۴۰ ثانیه، این‌بار شکستن هر گذرواژه چیزی در حدود ۱۲ سال طول خواهد کشید. شاید شما به چنین حدی از امنیت نیاز نداشته باشید و الگوریتم مقایسه‌ی سریع‌تری را بخواهید، بدین ترتیب bcrypt امکان توازن بین سرعت و امنیت را برای شما فراهم می‌کند. از آن استفاده کنید.

متن بالا ترجمه‌‌ی من بود از مقاله‌ی How To Safely Store A Password.

این نوشته در وبلاگ شخصی من: mahdavipanah.com/blog/bcrypt