PDA

View Full Version : خبر: از تابع md5 برای hash کردن استفاده نکنید



desatir7316
جمعه 23 تیر 1391, 22:38 عصر
سلام دوستان
خسته نباشید
داشتم help پی اچ پی رو در مورد تابع md5می خوندم که نوشته بود سعی کنید از توابعی مثل MD5, SHA1,SHA256 استفاده نکنید هرچند که طراحی شدن که خیلی سریع و موثر باشن دلیلش هم اینه که رمزی رو که این توابع درست می کنن خیلی زود می تونه شکسته بشه

حالا اگه از اینا استفاده نکنیم پس چیکار کنیم؟
در ادامه help دوتا تابع رو معرفی کرده که از اینا استفاده کنیم بهتره:
اولی تابع crypt هست که خودش چند تا الگوریتم رو پشتیبانی می کنه
شکل کلی دستور به این شکله:

Description
string crypt ( string $str [, string $salt ] )

که آرگومان اول خود اون مقداریه که باید رمزنگاری بشه و آرگومان دوم هم یه چیزی شبیه یه کلید برای رمزنگاریه

اینم چندتا مثال:

<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
password, to avoid problems when different hashing algorithms are used. (As
it says above, standard DES-based password hashing uses a 2-character salt,
but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
echo "Password verified!";
}
?>


<?php
// Set the password
$password = 'mypassword';

// Get the hash, letting the salt be automatically generated
$hash = crypt($password);
?>


<?php
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}

if (CRYPT_EXT_DES == 1) {
echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}

if (CRYPT_MD5 == 1) {
echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}

if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}

if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}

if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>

این مثال آخر اومده همه الگوریت هایی که با crypt میشه استفاده کرد و تو خروجی اورده(البته نمی دونم همه الگوریتم ها همیناس یا بازم هست)
نتیجه این مثال آخری یه چیزی مثل این می تونه باشه:

Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43 TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3In axBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgE rtP/EN5mcO.ChWQW21


تابع دوم hash هست که میشه این تابع رو فعال یه غیر فعال کرد پس انتظار نمیره همیشه دم دست باشه در حالی که تابع crypt این مشکل رو نداشت:

شکل کلی دستور به شکل زیره:

string hash ( string $algo , string $data [, bool $raw_output = false ] )
آرگومان اول نام الگوریتم برای هش کردنه،
آرگومان دوم هم اون مقداریه که قراره رمزنگاری بشه،
آرگومان سوم هم گفته اگه false باشه lowercase hexits بر می گردونه و اگرهم true باشه binary برمیگردونه

مثال:

<?php
echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.');
?>

امیدوارم که مفید بوده باشه

Unique
شنبه 24 تیر 1391, 00:01 صبح
دوست عزیز ! لطفا قل از قرار دادن یک موضوع کمی در موردش تحقیق کنین یا تجربیات خودتون را قرار بدین و از هر کسی و هر جا نقل قول نکنید ، میدونم قصد شما خیر و خوب و درست هست اما میتونه افراد را به مشکل بندازه ! از من هم دلخور نشین چون اگه دشمن شما بودم مثل خیلی ها این پست را نمیزدم !


سعی کنید از توابعی مثل MD5, SHA1,SHA256 استفاده نکنید هرچند که طراحی شدن که خیلی سریع و موثر باشن دلیلش هم اینه که رمزی رو که این توابع درست می کنن خیلی زود می تونه شکسته بشه

رشته ای که توابع MD5 و SHA1 و کلا توابع HASH بر میگردونند غیر قابل بازگشت هست ! یعنی با هیچ الگوریتمی نمیتونید به رشته اولیه برشون گردونید ! پس نتیجه میگیریم اصلا برای Encryption نیستند ! چون اصلا کلیدی وجود نداره که بخواین باهاش Decrypt کنید !

یکی از روش های پر استفاده از این توابع در زمان ذخیره کلمه عبور یا مقادیری هست که برنامه نویس نمیخواد اگه کسی اونها را توی پایگاه دید یا بهروشی کشف شد از ماهیت و رشته اصلی کسی با خبر بشه ! مشکل اصلی اینه که سایت های زیادی وجود دارند که پایگاه های بزرگی از مثلا MD5 های رشته های مختلف دارند ! مثلا شما اگه کلمه عبورتون 456956 باشه و اون را MD5 کنی ! یه نفر اگه رشته MD5 شما را ببینه میتونه بده به این سایت ها و رشته اصلی را بگیره ! بازم میگم اینها نمیتونند رشته اصلی را محاسبه کنند ! بلکه نظیر به نظیز میکنند.

این مشکل کاملا قابل حله ! شما میتونید از یک Prefix و Postfix در زمان md5 استفاده کنین ! مثلا اگه کسی پسوردش را گذاشت 1234 شما به اولش یک ahd#fdf4 و به آخرش هم یک 45**34@ اضافه میکنید ! و اون را MD5 میکنید ! اینجوری امکان پیدا شدن رشته اصلا وجود ندارن ! اگه خواستین یک کیلومتر کاراکتر اینطرف و اونطرف بگذارین تا خیالتون راحت بشه (شوخی کردم اینو البته).

امیدوارم نویسنده از صریح گویی بنده ناراحت نشده باشه که در این صورت ازشون عذرخواهی میکنم.

ravand
شنبه 24 تیر 1391, 08:05 صبح
حق با Unique هست.
بانک های اطلاعاتی مختلفی هستن که این رمز ها رو دارن نمونه اش این سایت:
http://md5.rednoize.com/
ولی این سایت ها فقط یه بانک اطلاعاتی هستند یعنی شما میتونی پسوردی بنویسی که اصلا توی این بانک های اطلاعاتی وجود نداشته باشه. و فقط خودت بدونی.

ayub_coder
شنبه 24 تیر 1391, 10:14 صبح
رشته ای که توابع MD5 و SHA1 و کلا توابع HASH بر میگردونند غیر قابل بازگشت هست ! یعنی با هیچ الگوریتمی نمیتونید به رشته اولیه برشون گردونید !

کاملا درسته. جایه نگرانی نیست.

این مشکل کاملا قابل حله ! شما میتونید از یک Prefix و Postfix در زمان md5 استفاده کنین ! مثلا اگه کسی پسوردش را گذاشت 1234 شما به اولش یک ahd#fdf4 و به آخرش هم یک 45**34@ اضافه میکنید ! و اون را MD5 میکنید ! اینجوری امکان پیدا شدن رشته اصلا وجود ندارن ! اگه خواستین یک کیلومتر کاراکتر اینطرف و اونطرف بگذارین تا خیالتون راحت بشه
آیا طول رشته برای MD5 اهمیتی نداره؟ در کل حجم اطلاعات ورودی چقدر می تونه باشه؟ ۱۰ صفحه- ۱۰۰۰ صفحه ۱۰۰۰۰۰۰ صفحه؟

desatir7316
شنبه 24 تیر 1391, 12:48 عصر
دوست عزیز ! لطفا قل از قرار دادن یک موضوع کمی در موردش تحقیق کنین یا تجربیات خودتون را قرار بدین و از هر کسی و هر جا نقل قول نکنید
سلام
جدا نمی دونستم سایت رسمی php هر کسی و هر جاییه وگرنه اصلا بهش اطمینان نمی کردم، در هر صورت ممنون که بهم گفتی
شاید من بد ترجمه کردم، البته من فقط اصل مطلب رو رسوندم ...
اینم به زبون اجنبی که توی خود راهنمای php بود:



Why are common hashing functions such as md5() and sha1() unsuitable for passwords?
Hashing algorithms such as MD5, SHA1 and SHA256 are designed to be very fast and efficient. With modern techniques and computer equipment, it has become trivial to "brute force" the output of these algorithms, in order to determine the original input.

Because of how quickly a modern computer can "reverse" these hashing algorithms, many security professionals strongly suggest against their use for password hashing.

How should I hash my passwords, if the common hash functions are not suitable?
When hashing passwords, the two most important considerations are the computational expense, and the salt. The more computationally expensive the hashing algorithm, the longer it will take to brute force its output.

There are two functions that are bundled with PHP that can perform hashing using a specified algorithm.

The first hashing function is crypt(), which natively supports several hashing algorithms. When using this function, you are guaranteed that the algorithm you select is available, as PHP contains native implementations of each supported algorithm, in case one or more are not supported by your system.

The second hashing function is hash(), which supports many more algorithms and variants than crypt(), but does not support some algorithms that crypt() does. The Hash extension is bundled with PHP, but can be disabled during compile-time, so it is not guaranteed to be available, while crypt() is, being in the PHP core.

The suggested algorithm to use when hashing passwords is Blowfish, as it is significantly more computationally expensive than MD5 or SHA1, while still being scalable.

اگرم اشتباهی از جانب من بوده عذر خواهی می کنم

desatir7316
شنبه 24 تیر 1391, 12:51 عصر
راستی اینم لینکش:
تورو خدا از md5 استفاده کنید (http://ir2.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash)

desatir7316
شنبه 24 تیر 1391, 14:56 عصر
حالا که تابع crypt رو گفتیم بهتره بیایم به الگوریتم هایی هم که با این تابع می شه استفاده کرد رو یه نگاهی بندازیم
البته من ترجمم جالب نیست به همین خاطر آخر لینکشون رو که به خود سایت اصلی php ارجاع داره می ذارم
ببینید دوستان من وابسته به هیچ ارگان یا گروهک خاصی نیستم و این مطالب رو از help خود php میارم پس جسارتا درست یا غلط بودنش رو خودتون قضاوت کنید.

راستی توی توضیحات پایین منظور از salt همون الگوی رمزنگاری هست.

CRYPT_STD_DES
یه هش استاندارد بر مبنای DES با دو کاراکتر از مجموعه
"./0-9A-Za-z" به عنوان salt هستش که استفاده غلط از کاراکتر ها برای salt باعث میشه تابع با شکست روبرو بشه
مثال:

if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}

نتیجه یه چیزی شبیه زیر میشه:

Standard DES: rl.3StKT.4T8M



CRYPT_EXT_DES
یک هش توسعه داده شده بر مبنای DES هست. توی این الگوریتم salt شامل 9 کاراکتر میشه که با یه underscore شروع میشه و که بعد از اون 4 بایت از کاراکترهای تکرارشونده و 4 بایت هم از salt میاد. اینها به عنوان کارکترهای قابل نمایش(چاپ شدنی)، کاراکترهای 6 بیتی و اولین کاراکتر کم اهمیت رمزگشایی شده اند. مقدار بین 0 و 63 به عنوان
"./0-9A-Za-z" رمزگشایی شده است.تفاده غلط از کاراکتر ها برای salt باعث میشه تابع با شکست روبرو بشه.
مثال:

if (CRYPT_EXT_DES == 1) {
echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}

نتیجه یه چیزی شبیه زیر میشه:

Extended DES: _J9..rasmBYk8r9AiWNc



CRYPT_MD5
الگوریتم هش MD5 با یه salt باطول 12 کاراکتر که مقدار salt با $1$ شروع میشه
مثال:

if (CRYPT_MD5 == 1) {
echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}

نتیجه یه چیزی شبیه زیر میشه:

MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0



CRYPT_BLOWFISH
blowfish hashing که salt اون به قراره زیره:
اول $2a$ ، بعد یه پارامتر ثابت 2 رقمی(کاراکتری) و بعد از اون دوبازه $ و نهایتا 22 رقم از الفبای
"./0-9A-Za-z".
استفاده از کاراکترها خارج از این محدوده باعث میشه که رشته ای با مقدار 0 برگردونده بشه.
پارامتر ثابت دو رقمی یه لوگاریتم مبنای 2 از مقادیر تکرار شدنی برای تضمین الگوریتم هش بر مبنای blowfish هست که باید توی محدوده ی 04-31 باشه ، مقادیر خارج از محدوده باعث میشه تابع با شکست روبرو بشه
مثال:

if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}


نتیجه یه چیزی شبیه زیر میشه:

Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi



CRYPT_SHA256
دارای یه salt شصت کاراکتریه که با $5$ هست.
اگر salt با
'rounds=<N>$' شروع بشه ، مقدار N مشخص کننده اینه که چند با تابع هش باید اجرا بشه که شباهت زیادی به همون پارامتر ثابت توی blowfish داره.
مقدار پیش فرض 5000 هست ، البته این عدد میتونه مقداری بین 1000 تا 999,999,999 باشه و هرعددی خارج از این محدوده با نزدیکترین مقدار جایگزین میشه.
مثال:

if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}

نتیجه یه چیزی شبیه زیر میشه:

SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43 TSaYhEWsQ1Lr5QNyPCDH/Tp.6



CRYPT_SHA512
توضیحاتی که برای این الگوریتم اورده شده دقیقا مثل قبلیه(البته اینجا چون مسلما باید تفاوت هایی با هم داشته باشن)
فقط مقدار salt با $6$ شروع میشه.
مثال:

if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}

نتیجه یه چیزی شبیه زیر میشه:

SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3In axBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgE rtP/EN5mcO.ChWQW21



اینم لینک از خود خود سایت php (http://ir.php.net/manual/en/function.crypt.php)

desatir7316
شنبه 24 تیر 1391, 15:11 عصر
با توجه به این:

دوست عزیز ! لطفا قل از قرار دادن یک موضوع کمی در موردش تحقیق کنین یا تجربیات خودتون را قرار بدین و از هر کسی و هر جا نقل قول نکنی
و در ادامه با توجه به این:

ته ای که توابع MD5 و SHA1 و کلا توابع HASH بر میگردونند غیر قابل بازگشت هست ! یعنی با هیچ الگوریتمی نمیتونید به رشته اولیه برشون گردونید ! پس نتیجه میگیریم اصلا برای Encryption نیستند ! چون اصلا
کلیدی وجود نداره که بخواین باهاش Decrypt کنید !

لطفا شما هم مرجع تون رو معرف کنید که توی اون فرموده این توابع غیر قابل بازگشت هستن
شاید من کمی اغراق کردم که گفتم زود شکسته میشن ولی هرچی باشه بر مبنای این نوشته ها این ادعا رو کردم:

With modern techniques and computer equipment, it has become trivial to "brute force" the output of these algorithms, in order to determine the original input.

Because of how quickly a modern computer can "reverse" these hashing algorithms, many security professionals strongly suggest against their use for password hashing.


اینم لینکش (http://ir.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash)

ببین دوست عزیر اینجا می خواستیم یه مطلبی بذاریم که سایرین استفاده کنن
حالا اومدی به این حال و روز درآوردیش
دمت گرم
خیلی مردی

AbiriAmir
شنبه 24 تیر 1391, 18:52 عصر
What is a salt?
A cryptographic salt is data which is applied during the hashing process in order to eliminate the possibility of the output being looked up in a list of pre-calculated pairs of hashes and their input, known as a rainbow table.

In more simple terms, a salt is a bit of additional data which makes your hashes significantly more difficult to crack. There are a number of services online which provide extensive lists of pre-computed hashes, as well as the original input for those hashes. The use of a salt makes it implausible or impossible to find the resulting hash in one of these lists.

دوست عزیز اینجا هم توضیح داده شده
الگوریتم هایی مثل md5 قابل بازگشت هستن اما نه با کامپیوترهای امروزی و به این راحتی
اینجا هم در مورد دیتابیس توضیح داده شده
salt رو توی md5 هم میشه استفاده کرد... حتما نیاز به استفاده از crypt نیست

desatir7316
شنبه 24 تیر 1391, 19:43 عصر
الگوریتم هایی مثل md5 قابل بازگشت هستن اما نه با کامپیوترهای امروزی و به این راحتی

در هر صورت قابل بازگشته
منم فقط می خوام بگم دوستان عزیز من، حالا که دارید رمزنگاری می کنید از این استفاده کنید بهتره
بین خوب و خوب تر
ظاهرا دوستان چیز دیگه ای متوجه شدن
من حرفم رو پس می گیرم
اصلا بهترین توابع دنیا md5 و دارودستشه

desatir7316
شنبه 24 تیر 1391, 19:50 عصر
دوستان عزیز مطالبی رو که می خواستم در مورد رمز نگاری بگم رو گفتم و من اطلاعات کامل تری ندارم
امیدوارم که مفید بوده باشه
مسلما بقیه عزیزان می تونن مطالب تاپیک رو ادامه بدن

Unique
یک شنبه 25 تیر 1391, 00:48 صبح
شرمنده دیر جواب میدم ! اما خدایی وقت نمیکنم در طول روز !
دوست عزیز توی منابع لاتینی که اشاره کردین همه جا از brute force استفاده شده ! و در نهایت گفته reverse میشه ! اما شما یک موضوع را داری اشتباه میکنی ! منظور از brute force همونی هست که من گفتم ! توی این تکنیک میان از پایگه های داده و combination های پیچیده استفاده میکنند تا رشته ابتدایی را حدس بزنند ! اما شما اگه از salt (رشته prefix که به ابتدای پسورد اضافه میکنید) و pepper (رشته postfix که به انتهای پسورد اضافه میشه) استفاده کنید امکان brute force نزدیک به صفر هستش !

البته این موضوع را هم بگم که در کل دیگه MD5 و SHA1 اعتبارشون را به خاطر بعضی مشکلات که میتونید اینجا (http://en.wikipedia.org/wiki/MD5) بخونید از دست دادند ولی در بسیاری از پروژه های متوسط کاربرد دارند ! حالا شما از SHA2 استفاده کنید که همچنان پر طرفدار هستش !

اگه واقعا دنبال امنیت بیشتر هستین با یک الگوریتم مناسب از salt های دینامیک استفاده کنید مثلا اگه تاریخ ثبت نام کاربر را ذخیره میکنید از اون به عنوان salt و از یک رشته ثابت به عنوان pepper استفاده کنید ! اینجوری کلا قضیه پیچیده میشه !

از اینکه فقط یک کوچولو عصبانی شدی متشکرم ! اگه من بودم دفاعی تر برخورد میکردم که این هم نشونه فهم شماست:چشمک:

eshpilen
دوشنبه 26 تیر 1391, 12:42 عصر
کلا استفاده از md5 و sha1 رو بهتره کنار بذاریم.

بخصوص برای هش پسورد هم سعی کنید اصلا از این دو تابع استفاده نکنید.
چون حتی استفاده از Salt و Pepper هم به تنهایی کافی نیست.
نیاز به Key stretching هم هست. یعنی همون تکرار کردن هش که باعث بشه تولید هر هش زمان خیلی بیشتری صرف کنه. مثلا هر هش یک دهم ثانیه زمان ببره، بجای اینکه چند میکروثانیه زمان صرف کنه.

البته حتی MD5 یا SHA1 هم اگر همراه با Salt و Pepper مناسب و Key stretching بکار بره امنیتش خیلی بالاتر میره، ولی بازم اصلا توصیه نمیشه. الان هم که مجبور به این کار نیستیم چون الگوریتم های جدیدتر و مطمئن تر مثل SHA256 دیگه همه جا در دسترس هستن.

تازه بگم شاید از دید اصولی امنیت حرفه ای بگن حتی از SHA256 (همراه با Salt و Pepper و Key stretching) هم برای هش پسوردها استفاده نکنید، و بجاش از الگوریتم های هشی مثل BLOWFISH که مخصوص اینطور کاربردها طراحی شدن استفاده کنید. اما خب بنده فکر نمیکنم دیگه نیاز به اینقدر وسواس و دردسر هم باشه. خصوصا که برنامه های معمولی جاهای دیگشون اینقدر امنیت قوی نداره که حالا بخوایم یه جاش رو درحد اعلی قوی کنیم. البته بنده خودم چون روی یک هاست خاص نتونستم از BLOWFISH استفاده کنم (ظاهرا ساپورت نمیشد و احتمالا بخاطر این بود که نسخهء PHP اون خیلی جدید نبود) ترجیح دادم از SHA256 استفاده کنم، وگرنه امنیت BLOWFISH بیشتره طبیعتا. تازه یک الگوریتم مخصوص دیگر بنام scrypt هم وجود داره که حتی از BLOWFISH هم خفن تره، اما پیاده سازی اون در PHP رو تاحالا ندیدم.

ضمنا دربارهء Salt و Pepper باید بگم که Salt یک رشتهء رندوم دارای حالتهای بقدر کافی زیاد باید باشه، و بهتره کاملا رندوم باشه، نه اینکه مثلا از روی زمان ثبت نام کاربر تولید شده باشه. حالا اینکه چرا باز خودش بحث داره که اگر خواستید میتونم بگم چرا. نکتهء دیگر اینکه، به ازای هر پسورد باید یک سالت رندوم متخص خودش رو داشته باشیم. و سالت همراه هش در دیتابیس ذخیره میشه.

فرق Pepper با سالت اینه که Pepper فقط یکی هست که در تولید هش تمام پسوردها بکار میره؛ فرق دیگرش هم اینه که Pepper در جایی غیر از دیتابیس ذخیره میشه (مثلا در فایل کانفیگ برنامه).

مکان قرارگیری Salt و Pepper هم زیاد مهم نیست، ولی تاجاییکه تاحالا از مطالعهء منابع مختلف استنباط کردم، بهتره در ابتدا درج کنید. مثلا به این شکل:

$pepper.$salt.$password

desatir7316
یک شنبه 15 مرداد 1391, 02:45 صبح
اینجا هم دوباره در موردش بحث شده
شاید مفید باشه:http://ashiyane.org/forums/showthread.php?p=396347#post396347

us1234
یک شنبه 15 مرداد 1391, 12:13 عصر
این بحثها در خصوص تابع های md5 جدیدا سر زبون ها افتاده ولی نظر کلی من برنامه نویس اگه برنامه نویس باشه به ترکیب های خاصی میتونه کاری کنه که پسورد اولا لو نره دوم لو رفت دی هش نشه ولی مساله مهمی که شما دوستان گرامی آنرا نقل نکردید مساله این چنین است : فکر کنید اسکریپتی داریم که پسورد های به صورت 1000% هش میکند که به هیچ وجه نمیشود آنرا دی هش کرد (منظور من ساخت کدی مشابه به آن است چون کاکترهایی به آن اضافه و یا کم شده است ) ولی هکر هرگز وقت خود را صرف این کار مسخره نمی کند چرا ؟ چون هکری که تونسته به بانک شما دست پیدا کنه به سادگی در فرم عضویت شما پسورد خود را وارد میکند با تابع شما آنرا هش میکند و توی دی بی سطر خودش را پیدا می کند پسورد خودش را کپی میکند و به جای پسورد ادمین قرار میدهد (تمامی موارد با انجکشن شدنیه !)
حالا به جای بحث سر امن بودن پسورد بروید سر امن بود دی بی و اسکریپت و باگ های آن بحث کنید !!!!
البته من راهکار جلوگیری از این کار را هم دارم که در صورت نیاز دوستان همینجا مطرح می کنم .
موفق باشید

eshpilen
دوشنبه 16 مرداد 1391, 09:03 صبح
گاهی هست هکر تونسته هش پسورد کاربر یا کاربران رو از دیتابیس بیرون بکشه (معمولا با باگ SQL Injection)، ولی هنوز دسترسی جدی بیشتری پیدا نکرده. در اینطور مواقع اگر بتونه هش رو کرک کنه و به پسورد اصلی برسه طبیعتا میتونه دسترسی خیلی بیشتر (و ضمنا مخفی) پیدا کنه.

دلیل دیگر اینه که بسیاری از کاربران از پسوردهای یکسان یا مشابه برای اکانتهای مختلف و سایتهای مختلف ممکنه استفاده کنن. در اینطور موارد هم رسیدن به اصل پسورد از هش اون، میتونه کمک خیلی مهمی به هکر باشه برای نفوذ به سایر اکانتهای کاربر.

ضمنا شما نبودی در iranphp.org هم روی این قضیه بحث کردی؟
خودت که راه جلوگیری از کپی کردن هش یک نفر به جای کس دیگر رو هم گفتی. کافیه username رو هم در هش دخالت بدی.
البته اونجا هم بهت گفتم که حتی این روش هم لزوما امنیت نمیده. ولی بهرحال بنظرم بهتره استفاده کرد.
از طرف دیگه فرض نکن که همه جا امکان همه کار در دسترس هکر هست. مثلا جایی هست که ممکنه سیستم یا اون بخش سیستم عمومی نباشه که دست هکر برای همه کاری مثل ثبت نام باز باشه. و بنظرم یه جایی ممکنه SQL Injection ای که هکر تونسته با موفقیت اجرا کنه درحد Read باشه یا بهرصورت به دلایلی محدودیت داشته باشه. حتی گاهی ممکنه دسترسی به هش پسورد کاربران از طریق دسترسی به نسخه های پشتیبان دیتابیس صورت گرفته.
خلاصه سناریوهای ممکن لزوما اینقدر ساده و محدود نیستن.


این بحثها در خصوص تابع های md5 جدیدا سر زبون ها افتادهخیر چندان جدید نیست.
چون شما و ما تازه فهمیدیم دلیل نمیشه جدید باشه.


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