# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی >  Decode نمودن رشته ای که با MD5 کد شده است

## mohammad_sabeghi

با سلام به همه دوستان
من با استفاده از الگوریتم MD5 رشته مورد نظرم را Code کرده ام 
سئوال من اینست که چگونه آن را Decode نمایم.

                                                              با تشکر

----------


## Developer Programmer

بسته به این که با چه کلیدی آنرا کد کرده اید می توانید کد گشایی کنید

----------


## Inprise

> من با استفاده از الگوریتم MD5 رشته مورد نظرم را Code کرده ام


Code با Hash متفاوت است . الگوریتم MD5 یک روش برای تولید Hash است نه Code . الگوریتمهای تولید Hash مثل MD5 یا SHA-1 و ... قابل بازگشت نیستند . یعنی رشته ای که از اعمال این الگوریتم ایجاد شده ، قابل تبدیل به موجودیت اولیه نیست . تنها راه "احتمالی" ، سعی/خطا و آزمودن کلیهء حالات ممکن و تولید Hash از هر حالت و مقایسهء Hash ها ست . حتی اگر با یک احتمال بی نهایت ضعیف ، خروجی این قیاس True باشه ، نمیشه اطمینان داشت که لزوما" آنچه از آن Hash گرفته شده ، همین است که از سعی/خطا به دست آورده ایم .

موفق باشی

----------


## Developer Programmer

:strange: 
خوب عمو اینپرایز اگه اینطور باشه که اصلا به چه دردی می خوره ما hash کنیم؟ مگه xxx داریم چیزی بسازیم که با اولش بر نمیگرده؟

----------


## Inprise

اول اینو بخون ،  بعد اگر نظرت عوض شد ، روی نحوهء عملکردت تو این فروم تجدید نظر کن . فکر میکنم این کاریه که این روزا خیلیها باید انجامش بدن .

عصر خوش

----------


## Mahsa Amiri

پس برنامه johncracker چطوری پسوردهای لینوکس و پیدا میکنه ؟ مگه اونا هم بصورت md5 ذخیره نمیشن ؟

----------


## Inprise

> چطوری پسوردهای لینوکس و پیدا میکنه ؟ مگه اونا هم بصورت md5 ذخیره نمیشن ؟


نحوهء ذخیره سازی به انتخاب کاربر و توزیع لینوکس بستگی داره . چند برنامه ای که پسوردها رو برمیگردونن ، یا زمانی عمل میکنند که Hashing اتفاق نیفتاده ، یا از Brute-Force استفاده میکنن ، که توضیحش اون بالا هست .

----------


## microsoftsat

با سلام

عذر میخوام که topic جدید باز نکردم! :wink: 
میخواستم بپرسم که md5 چند کاراکتر بر میگرداند؟ یعنی حداقل و حداکثر دارد؟ یا نه همیشه تعدادخاصی کاراکتر برمیگرداند!!؟

ممنونم./.  :oops:

----------


## linux

اگر به لینکی که داده شده بود می رفتی می دیدی که نوشته"
"MD5 روش برای تولید یک چکیده از یک پیام است ( Message Digest ) . چه یک کلمه ، یک عدد ، یک جمله ، یک کتاب چند صد صفحه ای ، یک فایل و ... به او بدهید ، یک چکیده با طول ثابت 128بیتی تولید میکند ."
هر ورودی که داده بشه خروجی 128 بیت خواهد بود!

----------


## microsoftsat

پس با این وجود، یک فیلد 16 کاراکتری براش کافیه؟!! :wink:

----------


## hmm

> هر ورودی که داده بشه خروجی 128 بیت خواهد بود!


اصلاح میکنم 128 بایتی!!!!

----------


## Inprise

خیلی برام عجیبه وقتی میبینم تا بحال حداقل سه بار در این مورد نوشته ام ؛ باز هم ...

همان "128 بیت" درست است .

----------


## hmm

> اصلاح میکنم 128 بایتی!!!!


باز هم اصلاح میکنم 128 بیتی !!!! :confy2:  :sorry:

----------


## microsoftsat

ار همتون متشکرم :oops:

----------


## seyedof

سلام
بله اگر کلید را داشته باشید قابل برگشت است به روش غیر brute force. ضمنا MD5 که من یکبار کار کردم فکر کنم ۱۶ بایت خروجی دارد یعنی ۱۲۸ بیت. اگر داده شما هم کمتر یا مساوی همین تعداد بیت باشد و روی آن MD5 را اعمال کنید، با داشتن کلید آن میتوان به داده اولیه رسید. به عنوان مثال در پروتکل RADIUS مخصوص Access Server ها که من روی نوشتن سرورش کار میکردم پسورد به همین شکل کد و دیکد میشد. هر چند اصولا کاربرد الگوریتمهای Hashing این نیست و برای حفظ Integrity داده ها و امضای دیجیتالی و Checksum به کار میروند.
ممنون علی

----------


## houtanal

البته اگر منظور شما Md5 است تا جایی که من اطلاع دارم کلیدی تولید نمی شود که با داشتن آن بتوان رشته هش شده را دیکد کرد.اصولا دیکد کردن عبارات هش شده بی معنیست.(کد نمشه که بخواد دیکد بشه)

در ضمن میزان حجم داده ربطی به توانایی در مورد استفاده از الگریتم های هشینگ ندارد.شما هر چیزی رو که به Md5 بدهید یک خروجی 128 بیتی همیشه ثابت و تقریبا منحصر به فرد (احتمال شباهت بین خروجی دو عبارت متفاوت خیلی کمه) به شما بر میگردونه

----------


## houtanal

> :strange: 
> خوب عمو اینپرایز اگه اینطور باشه که اصلا به چه دردی می خوره ما hash کنیم؟ مگه xxx داریم چیزی بسازیم که با اولش بر نمیگرده؟



اگر تو میتونی چیزی رو که کد کردی دیکد کنی بنابراین بقیه هم میتونن

برای نگه داری پسورد ها ، تهیه امضا برای تشخیص اعتبار داده موجود و... هش کردن بسیار راه گشاست.شخصا توصیه می کنم بنا بر برنامه و نحوه عملکردش از دو لایه (یا بیشتر) هشینگ استفاده کنید.مثلا ((('md5(sha1(md5('hello world 

این کار دو فایده داره
گمراه کردن مهاجم و تلف کردن وقتش.

----------


## someCoder

دو لایه هش!!! چرا آخه؟ 



> این کار دو فایده داره
> گمراه کردن مهاجم و تلف کردن وقتش.


منظور از گمراه کردن رو نمیدونم اما تلف کردن وقت همون یه مرحله رو هنوز کسی نشکسته که بخوایم دوتاش کنیم!

----------


## houtanal

> دو لایه هش!!! چرا آخه؟ 
> 
> منظور از گمراه کردن رو نمیدونم اما تلف کردن وقت همون یه مرحله رو هنوز کسی نشکسته که بخوایم دوتاش کنیم!


چرا من تا به حال چندین بار یک رشته MD5 را که حاوی پسورد بود را با بروت فورس بدست آوردم

منظور از گمراه کردن
من گاهی اگر واقعا لازم باشه رشته ای رو که توسط  برنامه ذخیره میکنم که الاظاهر می تونه یک رشته sha1 یا md5 باشه اما فی اولواقع نیست

----------


## someCoder

> چرا من تا به حال چندین بار یک رشته Md5 را که حاوی پسورد بود را با بروت فورس بدست آوردم


اینکه با بروت فورس شکستیش دلیلش امنیت کم پسورد انتخاب شده بوده، نه شکستن Md5 یا Sha1! چون اگر طرف 6 بار هم هش میکرد، تو هم توی بروت فورس از 6 بار هش استفاده میکردی.

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

----------


## seyedof

> البته اگر منظور شما Md5 است تا جایی که من اطلاع دارم کلیدی تولید نمی شود که با داشتن آن بتوان رشته هش شده را دیکد کرد.اصولا دیکد کردن عبارات هش شده بی معنیست.(کد نمشه که بخواد دیکد بشه)
> 
> در ضمن میزان حجم داده ربطی به توانایی در مورد استفاده از الگریتم های هشینگ ندارد.شما هر چیزی رو که به Md5 بدهید یک خروجی 128 بیتی همیشه ثابت و تقریبا منحصر به فرد (احتمال شباهت بین خروجی دو عبارت متفاوت خیلی کمه) به شما بر میگردونه


سلام

بله من چون خیلی وقت پیش روی این موضوع کار میکردم RADIUS Server که در اوونجا پسورد رو با MD5 یک کلمه رمز و شماره درخواست XOR میکرد بعد روی شبکه میفرستاد، اشتباه کردم. MD5 یک Hashing یک طرفه است.

در مورد میزان حجم داده و... من هم چیزی غیر از این نگفتم و دقیقا به همین مطلب اشاره کردم که اندازه داده ها هر قدر باشه MD5 آن ۱۲۸ بیت خواهد بود. مانند CRC32 که ۳۲ بیت خروجی دارد.
ممنون علی

----------


## houtanal

> اینکه با بروت فورس شکستیش دلیلش امنیت کم پسورد انتخاب شده بوده، نه شکستن Md5 یا Sha1! چون اگر طرف 6 بار هم هش میکرد، تو هم توی بروت فورس از 6 بار هش استفاده میکردی.


به هر حال تو هیچ وقت نمیتونی امنیت چیزی رو صد در صد تضمین کنی.تنها کاری که میشه کرد پایین آوردن درصد ریسک است.تلف کردن وقت مهاجم یکی از این راه هاست.توجه کن که مهاجم برای این که بتونه در بنامش از همون الگوریتم لایه بندی تو استفاده کنه محبوره حداقل یک بار یکی از رشته های هش شده ات رو بدست بیاره.

هر کسی با داشتن یک rainbow table خوب + یک سیستم سریع می تونه قوی ترین پسورد ها رو هم (احتمالا) بدست بیاره.

----------


## someCoder

> هر کسی با داشتن یک rainbow table خوب + یک سیستم سریع می تونه قوی ترین پسورد ها رو هم (احتمالا) بدست بیاره


من اینطور فکر نمیکنم! حاضرم ثابت کنم! میخوای من یه رشته رو Hash کنم و یا مثلا با AED یا حتی 3DES روم کنم، اونوقت اگر کسی تونست کرکش کنه! هم ریاضی و هم تجربه نشون داده که نمیشه. مگر اینکه پسورد اونقدر ضعیف باشه که بشه حدسش زد.

----------


## Sirus-v

اگر یک عبارت 2 بار MD5 بشه با قوی ترین سیستم ها هم مراحل کرک به هفته ها می کشه و به CPU آسیب می رسه . من روی قوی ترین و پرسرعت ترین سرور های لینوکس این قضیه رو تست کردم . می دونید Brute Force کردن یک عبارت 32 کارکتری یعنی چی ؟؟؟؟ یعنی فاجعه . امکان لو رفتنش خیلی کمه . و اما اگه 3 یا 4 بار هاش بشه امنیت کامل پسورد از نظر کرکینگ برقراره . در ضمن هیچ کلیدی در MD5 وجود نداره منظورم کلید Public و Priv8 هست . MD5 توسط یک پروفسور ریاضی طراحی شده  و مشکلی برش وارد نیست .

----------


## someCoder

> اگر یک عبارت 2 بار MD5 بشه با قوی ترین سیستم ها هم مراحل کرک به هفته ها می کشه و به CPU آسیب می رسه .


اولا که اگر یک بار کد بشه کرک کردنش به *قرنها* میکشه! دیگه دو بارشو من درک نمیکنم چه صیغه ایه!
ضمنا من تو کف این ماجرای سوختن CPU هستم!!!!!!!!!!!(و هزار تا علامنت تعجب دیگه!)
آخه چه ربطی داره ... به شقیقه!

----------


## houtanal

قرنها؟؟!!!
احتمالا برات پیش نیومده که نیاز به این کار داشته باشی

----------


## someCoder

اگر شک داری امتحانش مجانیه!
میخوای برات یه رشته Hash کنم و تونستی قبل از 100 سال دیگه برام کرکش کن!

----------


## بابک زواری

در الگوریتم هش کردن یک آرایه مقدار دهی میشود (به کد زیر ) ؛ حال اگر این مقادیر رو من تغییر بدم مشکلی در نتیجه حاصله بوجود میاد یا نه

Public Sub loadArrayValues()
    m_lOnBits(0) = CLng(1)
    m_lOnBits(1) = CLng(3)
    m_lOnBits(2) = CLng(7)
    m_lOnBits(3) = CLng(15)
    m_lOnBits(4) = CLng(31)
    m_lOnBits(5) = CLng(63)
    m_lOnBits(6) = CLng(127)
    m_lOnBits(7) = CLng(255)
    m_lOnBits(8) = CLng(511)
    m_lOnBits(9) = CLng(1023)
    m_lOnBits(10) = CLng(2047)
    m_lOnBits(11) = CLng(4095)
    m_lOnBits(12) = CLng(8191)
    m_lOnBits(13) = CLng(16383)
    m_lOnBits(14) = CLng(32767)
    m_lOnBits(15) = CLng(65535)
    m_lOnBits(16) = CLng(131071)
    m_lOnBits(17) = CLng(262143)
    m_lOnBits(18) = CLng(524287)
    m_lOnBits(19) = CLng(1048575)
    m_lOnBits(20) = CLng(2097151)
    m_lOnBits(21) = CLng(4194303)
    m_lOnBits(22) = CLng(8388607)
    m_lOnBits(23) = CLng(16777215)
    m_lOnBits(24) = CLng(33554431)
    m_lOnBits(25) = CLng(67108863)
    m_lOnBits(26) = CLng(134217727)
    m_lOnBits(27) = CLng(268435455)
    m_lOnBits(28) = CLng(536870911)
    m_lOnBits(29) = CLng(1073741823)
    m_lOnBits(30) = CLng(2147483647)
    
    m_l2Power(0) = CLng(1)
    m_l2Power(1) = CLng(2)
    m_l2Power(2) = CLng(4)
    m_l2Power(3) = CLng(8)
    m_l2Power(4) = CLng(16)
    m_l2Power(5) = CLng(32)
    m_l2Power(6) = CLng(64)
    m_l2Power(7) = CLng(128)
    m_l2Power(8) = CLng(256)
    m_l2Power(9) = CLng(512)
    m_l2Power(10) = CLng(1024)
    m_l2Power(11) = CLng(2048)
    m_l2Power(12) = CLng(4096)
    m_l2Power(13) = CLng(8192)
    m_l2Power(14) = CLng(16384)
    m_l2Power(15) = CLng(32768)
    m_l2Power(16) = CLng(65536)
    m_l2Power(17) = CLng(131072)
    m_l2Power(18) = CLng(262144)
    m_l2Power(19) = CLng(524288)
    m_l2Power(20) = CLng(1048576)
    m_l2Power(21) = CLng(2097152)
    m_l2Power(22) = CLng(4194304)
    m_l2Power(23) = CLng(8388608)
    m_l2Power(24) = CLng(16777216)
    m_l2Power(25) = CLng(33554432)
    m_l2Power(26) = CLng(67108864)
    m_l2Power(27) = CLng(134217728)
    m_l2Power(28) = CLng(268435456)
    m_l2Power(29) = CLng(536870912)
    m_l2Power(30) = CLng(1073741824)
        
    K(0) = &H428A2F98
    K(1) = &H71374491
    K(2) = &HB5C0FBCF
    K(3) = &HE9B5DBA5
    K(4) = &H3956C25B
    K(5) = &H59F111F1
    K(6) = &H923F82A4
    K(7) = &HAB1C5ED5
    K(8) = &HD807AA98
    K(9) = &H12835B01
    K(10) = &H243185BE
    K(11) = &H550C7DC3
    K(12) = &H72BE5D74
    K(13) = &H80DEB1FE
    K(14) = &H9BDC06A7
    K(15) = &HC19BF174
    K(16) = &HE49B69C1
    K(17) = &HEFBE4786
    K(18) = &HFC19DC6
    K(19) = &H240CA1CC
    K(20) = &H2DE92C6F
    K(21) = &H4A7484AA
    K(22) = &H5CB0A9DC
    K(23) = &H76F988DA
    K(24) = &H983E5152
    K(25) = &HA831C66D
    K(26) = &HB00327C8
    K(27) = &HBF597FC7
    K(28) = &HC6E00BF3
    K(29) = &HD5A79147
    K(30) = &H6CA6351
    K(31) = &H14292967
    K(32) = &H27B70A85
    K(33) = &H2E1B2138
    K(34) = &H4D2C6DFC
    K(35) = &H53380D13
    K(36) = &H650A7354
    K(37) = &H766A0ABB
    K(38) = &H81C2C92E
    K(39) = &H92722C85
    K(40) = &HA2BFE8A1
    K(41) = &HA81A664B
    K(42) = &HC24B8B70
    K(43) = &HC76C51A3
    K(44) = &HD192E819
    K(45) = &HD6990624
    K(46) = &HF40E3585
    K(47) = &H106AA070
    K(48) = &H19A4C116
    K(49) = &H1E376C08
    K(50) = &H2748774C
    K(51) = &H34B0BCB5
    K(52) = &H391C0CB3
    K(53) = &H4ED8AA4A
    K(54) = &H5B9CCA4F
    K(55) = &H682E6FF3
    K(56) = &H748F82EE
    K(57) = &H78A5636F
    K(58) = &H84C87814
    K(59) = &H8CC70208
    K(60) = &H90BEFFFA
    K(61) = &HA4506CEB
    K(62) = &HBEF9A3F7
    K(63) = &HC67178F2

End Sub

----------


## someCoder

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


البته فکر کنم اینطور باشه! مطمئن نیستم

----------


## بابک زواری

مهم نیست که استاندارد نباشه ؛ مشکل نداشته باشه و بتونم ازش استفاده کنم کافیه

----------


## someCoder

تا جایی که من میدونم نباید مشکلی پیش بیاد. البته بهتره اساتید هم در این مورد نظر بدن

----------


## ICEMAN

تا جایی که من میدونم Md5 یه الگریتم یه طرفه است و بر نمی گرده

----------


## بابک زواری

> تا جایی که من میدونم Md5 یه الگریتم یه طرفه است و بر نمی گرده


اینکه واضحه ؛ تمام بحثم از اول روی این محور میچرخه .
مطالب رو از اول یکبار دیگه بخون به لینک استاد اینپرایز هم توجه کن

----------


## someCoder

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

----------

