MD5 مرده است! بهترین روش برای ذخیره رمز عبور کاربران

۳ دیدگاه

زمان هر چه قدر به جلوتر میره کامپیوترهای ما هم سریعتر و سریعتر می شوند و الگوریتم های معمول Hash هم در مقابل کرک شدن، آسیب پذیر تر می شوند. در حال حاضر افزایش شدیدی در حملات امنیتی داریم و ما باید مطمئن شویم که رمز های عبور کاربران که در پایگاه داده ما ذخیره شده اند امن بوده و امکان کرک شدن ندارند.

حالا چطور می توانیم کلمات عبور کاربران را در دیتابیس به صورت امن ذخیره کنیم؟

۳ روش برای ذخیره رمز عبور کاربران در پایگاه داده به ذهن می رسد

۱- ذخیره به صورت متن معمولی

این روش واقعا خطرناک است! رمزهای عبور بدون محافظ رها شده اند و چون اکثر افراد از رمزهای یکسان برای همه سایت ها استفاده می کنند لو رفتن رمز عبورشان می تواند خطر بزرگی برای شان ایجاد کند.

۲- کدگذاری قبل از ذخیره

اینکه رمز عبور را قبل از ذخیره کردن با یک کلید کدگذاری کنیم روش دیگریست ولی یک اشکال بزرگ دارد. اگر هکر بتواند کلید را پیدا کند می تواند به راحتی همه رمزهای عبور را به شکل خام برگشت دهد. بعضی از کمپانی های بزرگ مثل Adobe از این روش استفاده می کنند!

۳- هش کردن رمز عبور

هش کردن به تبدیل یک متن به کاراکترهایی بر اساس الگوریتم های خاص می گویند که بر عکس کدگذاری، قابل برگشت به متن اصلی خود نیستند.الگوریتم های زیادی برای هش وجود دارد مثل md5, sha1, bcrypt و … .احتمال زیاد md5 را شنیده اید یا با آن کار کرده اید.

md5 مرده است

یکی از مهم ترین دلایل مردن md5 این است که سرعت الگوریتم آن بسیار بالاست.یک کامپیوتر مدرن با کارت گرافیک معمولی می تواند ۱۰ میلیارد رمز md5 را در هر ثانیه کرک کند. در این باره می توانید ویدیوی زیر را ببینید:

حالا چطور رمز های عبور را به صورت امن در سال ۲۰۱۸ ذخیره کنیم؟

جواب استفاده از یک الگوریتم هش بسیار کند به همراه پسوند یا پیشوند (salt) است. توصیه اول php الگوریتم bcrypt است. این الگوریتم بسیار کند می باشد و اگر کمی پسوند و پیشوند هم داشته باشد تقریبا هیچ هکری نمی تواند آن را کرک کند چون خیلی زمان نیاز خواهد داشت.

php یک تابع بنام password_hash برای هش کردن رمز های عبور اضافه کرده است و همچنین تابع password_verify را برای چک کردن صحت تطابق دو رمز عبور (زیرا در این الگوریتم، عبارت هش شده یک متن ، متفاوت از هم خواهد بود و تطابق معمولی هش == هش پاسخگو نیست).

یک نمونه از نحوه استفاده از این دو تابع کاربردی را می توانید در زیر ببینید:

<?php

echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT)."\n";

$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>

منبع

دسته بندی : PHP

3 نظر

  1. من برای امنیت بیشتر، یک عبارت به اول و آخر پسورد کاربر اضافه میکنم و بعد Hash می‌کنم. مثلاً اگر پسورد کاربر باشه: “qwerty”، به راحتی با سایت‌هایی مثل crackstation.net و… میشه از روی Hash پسورد کاربر رو بدست آورد.
    اما اگر پسورد کاربر رو به این شکل Hash کنیم:
    key1_qwerty_key2
    (بجای key1 و key2 عبارت دلخواه خودتون رو قرار بدید)
    عملاً غیر قابل پیدا شدن هست.
    مثال:
    Kz5p39QuFmma1koi4u_qwerty_zX17Ds0wvP5cX4y22IwKng
    MD5: a42c8041727cdcf1cc96cfcf5b6b1c48
    و اینطوری این md5 دیگه برگشت پذیر نیست!

    1. روش خوبیه گذاشتن این عبارت ولی هکر معمولا می تونه این کد رو به راحتی از داخل کد شما پیدا کنه و اول و آخر پسورد ها اضافه کنه. مشکل اینه که سرعت این الگوریتم ها خیلی بالاست و هکر می تونه در زمان کم تعداد خیلی زیادی رو چک کنه ولی الگوریتم های جدید مثل bcrypt سرعت کارشون خیلی پایینه و عملا برای هکر صرف نمی کنه بخواد کرک کنه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

More in PHP
جلوگیری از آپلود تصاویر و ویدیوهای مبتذل در سایت مان با سرویس Cloudinary

برنامه ها و سایت های مختلفی وجود دارند که کاربران اینترنت می توانند داخل آنها تولید محتوا کنند و مطالب...

Close