توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : انواع Hash و کاربرد آن در PHP
defcon2
04-05-2010, 05:23 AM
با سلام
____________________
در این تاپیک سعی دارم به مبحث به رمز در آوردن یک طرفه کلمات عبور (Password Hashing) در PHP را مورد بحث قرار دهیم.
موضوعی که عموما توسط بسیاری از نوآموزان PHP نادیده گرفته میشود.
در بسیاری از نرم افزارهای (ضعیفی) که با PHP نادیده گرفته میشود اطلاعات اعضا (User Profile) به صورت متن ساده (Plain Text) در بانک اطلاعاتی ذخیره میشوند.
هش کردن کلمات عبور راهی است برای به رمز در آوردن (Encrypt) کلمات عبور قبل از ذخیره سازی
آنها در بانک اطلاعاتی تا هنگام دسترسی افراد غیر مجاز به باتک اطلاعاتی، میزان خسارت کمتر میشود.
هش کردن به هیچ وجه روش جدیدی به حساب نمی آید و از مدت ها قبل در سیستم های مبتنی بر UNIX برای ذخیرسازی کلمات عبور استفاده میشده است.
__________________________________________________ __________________________
defcon2
04-05-2010, 05:35 AM
پیش گفتار
هنگام مطالعه این مقاله مشاهده خواهید کرد که ما از روشی به نام (SHA-1) یا Security Hashing Algorithm برای هش کردن استفاده میکنیم .
تا هنگام نگاشته شدن این مقاله گروهی از محققان Hongbo Yu ، Yiqun Lisa Yin ، Xiaoyun wang نشان داده اند که SHA-1 ضعیف تر از آن چیزی است که به نظر میرسد است،
به این معنی که هم اکنون برای موارد خاص مانند امضاهای دیجیتالی ، الگوریتم های فوی تری مانند SHA-256 و SHA-512 توصیه میشود.
ولی برای هش کردن کلمات عبور در برنامه های امروزی SHA-1 هنوز سطح امنیت بسیار خوبی را فراهم میکند.
برای اطلاعت بیشتر لطفا تحلیل Bruce Schneier را در مورد این موضوع ببینید.
[Only registered and activated users can see links]
defcon2
04-05-2010, 05:52 AM
هش چیست ؟
هش (Hash , Hash Code , Digest , Messag Digest) هم نامیده میشوند.
را میتوان به صورت اثر انگشت دیجیتالی یک داده در نظر گرفت.
با این روش شما میتوانید رشته ای با اندازه ی ثابت (Fixed length) از یک داده بدست بیاورید که با روش های ریاضی به صورت "یک طرفه" رمز نگاری شده است.
کشف رشته اصلی از رشته هش شده آن (عملیات معکوس) به صورت کارا تقریبا غیر ممکن است.
نکته دیگر اینکه هر داده یک رشته هش شده کاملا منحصر به فرد ایجاد میکند.
(احتمال یکی شدن رشته های هش دو رشته متفاوت در الگوریتم MD5 یک در e+383/4028236692093846346337460743177 میباشد.)
defcon2
04-05-2010, 06:05 AM
این خواص، هش کردن را به روشی کارا و ایده آل برای ذخیره سازی کلمات عبور در برنامه های شما تبدیل میکند. چرا ؟
برای این که جتی اگر یک Hacker بتواند به سیستم و بانک اطلاعاتی شما نفوذ کند و بخشی از اطلاعات شما را به دست آورد (شامل کلمات عبور هش شده) نمیتواند کلمات عبور اولیه را از روی آن ها بازیابی کند!
پس با این روش چگونه اعضا را شناسای کنیم؟
گفتیم که بازیابی کلمه عبور اصلی از روی رشته هش تقریبا غیر ممکن است، خب چگونه برنامه های ما تشخیص دهند که کلمه عبور وارد شده توسط کاربر صحیح است؟ به سادگی!
با تولید رشته هش کلمه عبور وارد شده توسط کاربر و مقایسه آن با رشته هش ذخیره شده در رکورد بانک اطلاعاتی موبوط به کاربر میتوانید متوجه شوید که ایا دو رشته با هم برابرند یا نه.
در پست بعدی با ذکر 1 مثال ادام میدهیم...
defcon2
04-05-2010, 06:52 AM
ثبت نام اعضا و بازبینی کلمات عبور
در طی پروسه ثبت نام، کاربر جدید کلمه عبور انتخابی خود را در اختیار ما قرار میدهد.
(ترجیحا با بازبینی -Verification- و در یک جلسه امن).
با استفاده از تکه کدی ما نام کاربری (Username) و کلمه عبور (Password) را در بانک اطلاعاتی ذخیره میکنیم.
<?php
/* store user datails */
$passwordHash = sha1($_POST['password']);
$sql = ' INSERT INTO user
(username,passwordHash) VALUES (?,?)';
$result = $db->query($sql, arry($_POST['username'],
$passwordHash))
?>
در هنگام مراجعه بعدی کاربر برای ورود به سیستم، برای تائید او از تکه کدی مانند زیر استفاده میکنیم.
<?php
/* check user datails */
$passwordHash = sha1($_POST['password']);
$sql = 'SELECT username FROM user WHERE
username = ? AND passwordHash = ?' ;
$result = $db->qurey($sql,
array($_POST['username'], $passwordHash));
if ($result->unmRows() < 1)
{
/*Aceess denied */
echo 'sorry, your username or password
was incorrest!';
}
else
{
/* Log user in */
Printf('Welcome back %s!',
$_POST['username'] ) ;
}
?>
defcon2
04-05-2010, 07:06 AM
انواع هش
انواع مختلفی از الگوریتم های قوی هش کردن موجود است که از محبوب ترین آن ها به MD5 , SH1 اشاره کرد.
سیستم های قدیمی تر از (Data Enycryption Standard) یا DES استفاده میکردند.
که این روش 56 بیتی دیگر یک روش قوی هش کردن محسوب نشده و استفاده از آن توصیه نمیشود.
در PHP شما میتوانید رشته هش را با استفاده از توابع md5() و sha1 تولید کنید. md5() یک رشته هش 128 بیتی (32 کاراکتر هگزاد دسیمال) بر میگرداند در حالیکه sha1() یک رشته هش 160 بیتی
(40 کاراکتر هگزاد دسیمال) برمیگرداند.
<?php
$string = 'PHP & information security';
printf(<<Original string %sn>>, $string);
print(<<MD5 hash: %sn>>, md5($string));
print(<<SHA_1 hash: %sn>>, sha1 ($string)) ;
?>
این کد خروجی را تولید میکند.:
Original string: PHP & Information Security
MD5 hash: 88dd8f282721af2c704e238e7f338c41
SAH-1 hash: b47210650996b9aa0129f88695e229ce309dd362
defcon2
04-06-2010, 01:05 AM
در MySQL شما میتوانید رشته هش را مستقیما و توسط توابع درونی درونی Password() و md5() و یا sha1() تولید کنید.
Password() تابعی است که توسط خود MySQL برای سیستم تائید اعضایش به کار میرود.
این تابع یک رشته 16 بایتی (128 بیتی) -در MySQL قبل از نسخه -1/4 و یک رشته 41 بایتی (328 بیتی) بر پایه الگوریتم SHA-1 دوگانه -در MySQL 4.1 به بالا - تولید میکند.
md5() از نسخه 2/23/3 و sha() در نسخه 2/0/4 به MySQL اضافه شد.
mysql> select PASSWORD ( ' PHP & Information
Security' );
+------------------------------------------+
| PASSWORD( 'PHP & Information security' ) |
+------------------------------------------+
| 379693e271cd3bd6 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select MD5( 'PHP & Information security' );
+------------------------------------------+
| MD5 ( 'PHP & Information Security' ) |
+------------------------------------------+
| 88dd8f282721af2c704e238e7f338c41 |
+------------------------------------------+
1 row in set (0.00 sec)
Noet: Using MySQL>s password() function in
your own application inn>t recommended -
the algorrithm used has changed over time and poior to 4.1 was particularly week
defcon2
04-06-2010, 02:45 AM
شما ممکن است ترجیح دهید تا از MySQL برای تولید رشته هش در برنامه های خود استفاده کنید.
مثلا در این مثال این ....
<?php
/* store user datails */
$sql = 'INSERT INTO user (username, passwordHash)
VALUES (?, SHA1(?))' ;
$result = $db-> query($sql, array($_POST['username'],
$_POST['password'] ) ) ;
?>
در پست بعدی به نقاط ضعف میپردازیم...
defcon2
04-06-2010, 03:16 AM
نــقــاط ضــعــف
از دیدگاه امنیتی ، ذخیره کردن رشته های هش کردن کلمات عبور به صورت تنها در بانک طلاعاتی
کافی است تا کار یک نفوذگر را ده ها برابر مشکل کند.!
حال بگذاریم ببینیم یک نفوذگر پس از دسترسی به این رشته های هش شده چه تلاش هایی برای بازیابی آنها می کند.
آیا او میتواند کلمات عبور اصلی را بازیابی کند یا خیر ؟
او میتواند در ابتدا با مشاهده جداول اعضا و با پیدا کردن رشته های هش مشابه، حساب هایی که دارای کلمات عبور یکسان هستند را بیابد!
البته این روش تا زمانی که او کلمه عبور هشچ کدام از اعضا را نداند مفید است و خطری را ایجاد نمیکند.
روش معمول برای بازیابی رشته اصلی ار رشته هش شده شکستن (Crack) -یا به عبارت دیگر Brute Forcing -می باشد.
با استفاده از این روش هکر رشته هش تمامی عبارتی که احتمال می دهد به عنوان کلمه عبور به کار برده شود.
-مثلا با استفاده از یک دیکشنری لغات- را تولید میکند. و یا مقایسه آنها با مقادیر ذخیره شده در بانک اطلاعاتی اقدام به یافتن کلمات عبور (password) می کند.
رایانه های پیشرفته امروزی توانایی تولید رشته های هش شده MD5 و SHA-1 را به صورت بسیار
سریع دارا میباشد - در بعضی حالات با سرعت های در حدود چند هزار ثانبه - رشته های هش میتوانند برای تمامی کلمات یک دیکشنری تولید کلمات یک دیکشنری تولید شوند.
(حتی با احتساب حالت های متفاوت حرفی و عددی).
با این کلمات عبور مناسب و طویل سطح امنیتی خوبی را در برابر چنین حملاتی فراهم می کنند،
شما نمیتوانید مطمئن باشید که کاربران شما همواره از چنین مواردی آگاه باشند.
vBulletin® v3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.