-
تغییر مقادیر فیلد Password با دستور SQL
با سلام...
من با استفاده از دستور SQL زیر مقدار فیلد username رو از مثلاً a1 ، a2 ، a3 و... به b1 ، b2 ، b3 و ... به راحتی تغییر دادم :
کد:
update `jos_users`
set `username` = replace(`username`,"a","b");
اما حالا میخوام مقدار فیلد password رو هم تغییر بدم ولی همونطور که میدونید مقادیر این فیلد Encrypt شده هستش! و مقدار a به صورت کد شده در این فیلد ذخیره میشه و نمیشه گفت هرجا a بود به b تبدیل کن!
آیا راهی هست که مشکلم حل شه!؟
ویرایش توسط Pr0grammer : 10-18-2012 در ساعت 07:31 PM
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
-
10-18-2012 07:03 PM
# ADS
تبلیغات در جوملا فارسی
-
سخت نباید باشه... اینو ببین :
کد:
UPDATE `jos_users` SET `password` = MD5( 'b' ) WHERE `jos_users`.`password` = MD5( 'a' )
فک کنم کار می کنه...
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
-
مرسی، اما متاسفانه نشد!
حتی کد زیر رو هم امتحان کردم، نشد :
کد:
UPDATE `jos_users` SET `password` = replace(`password`, MD5('a'), MD5('b'))
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
-
کار می کنه فقط جای اون تک کتیشن، دَبل بزن حله...
کد:
UPDATE `jos_users` SET `password` = MD5( "secret" ) WHERE `jos_users`.`password` = MD5( "admin" ) ;
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
-
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
-
خوب اینکه نمی شه علتش اینه که پسورد ها قبل از اینکه با متد MD5 بخوان Hash بشن و توی بانک نوشته بشن، اول با یه رشتهء رندم دیگه Salt می شن(یعنی نمکشون زیاد می شه اصتلاحا)، که اون رشته رندم با استفاده از همون فیلد معروف secret فایل configuration.php تولید می شه.
مثلا :
کد:
var $secret = 'tiDvqWRGWhlKLNHR';
حالا کلا یعنی، پسوردی که الان تو بانک ذخیره شده، برای مثال :
کد:
Username: user
Password: pass
به این صورت ِ :
کد:
username = user
password = ea92823e6a5118fde6068c343fefc292:WTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER
که اینطوری درست شده :
جوملا یه رشته 32 بیتی رندم درست کرده که اینه تو این مثال :
کد:
salt = WTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER
که همون مقدار salt هست.
حالا پسورد رو که pass باشه به این صورت hash می کنه و بعدم مثل اون بالا که گفتم، یه ':' رو هم به عنوان فیلد جدا کننده استفاده می کنه و اون رشتهء رندم رو هم بهش اضافه می کنه. که می شه :
کد:
password = MD5(passWTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER) + ':' + WTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER
حالا چطور می شه این پسورد encrypt شده رو decrypt کرد؟
جوابش هم ساده است، اصلا نمی شه.
خود جوملا وقتی می خواد ببینه یه یوزر و پسورد مچ هست یا نه، از روی فیلد یوزر، مقدار salt رو پیدا می کنه و پسورد وارد شده رو دوباره hash می کنه و چک می کنه که با بخش اول فیلد پسورد مچ باشه.
خلاصه، نمی تونی با یه کوئری با شرط چک کردن مقدار فیلد پسورد کاری از پیش ببری...
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
کاربر مقابل از samir عزیز به خاطر این پست مفید تشکر کرده است:
-
خوب اون بخش آخر که کاری نمی شه کرد ،اشتباه بود...
اینو یه امتحانی بکن :
کد:
SELECT * FROM `jos_users` WHERE
Substring_index( `jos_users`.`password` , ':', 1 ) =
MD5( CONCAT( 'PASSWORD' , Substring_Index( `jos_users`.`password`,':', -1)));
که باید جای مقدار PASSWORD همون پسورد خودت رو بزنی، این کوئری سطرهایی که مقدار پسوردشون برابر PASSWORD هست رو برمی گردونه...
حالا که این کار می کنه؛ پس اینم دیگه کار می کنه :
کد:
UPDATE `jos_users` SET `password` = MD5( "NEW_PASSWORD" )
WHERE
Substring_index( `jos_users`.`password` , ':', 1 ) =
MD5( CONCAT( 'OLD_PASSWORD' , Substring_Index( `jos_users`.`password`,':', -1)));
فقط یکم مسئله امنیتی داره این کار، اونم اینه که رشته جدید پسورد دیگه salt نشده توی بانک ذخیره می شه... یعنی انگار که مقدار رشته salt الان NULL هست...
جهت مشاهده لینک ها باید ثبت نام کنید یا لاگین کنید.
-
کاربر مقابل از samir عزیز به خاطر این پست مفید تشکر کرده است:
علاقه مندی ها (Bookmarks)