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



























دوستان مشکل دقیقا همینه ! ، حمید توضیحات خوبی داد ، من خودم خیلی ریاضی باز نیستم D: ، اما بالاخره 4 تا تابع و شرط و فرمول بلدیم ! ، شروع کردم به نوشتن ، اتفاقا با همون کد اسکی شروع کردم ، یه آرایه ساختم ، حروف الفبا کوچیک بزرگ و اعداد رو داشت و یک آرایه ی الگو بهش دادم گفتم شروع کن به ساختن و طبق یه سری دستور ریاضی هر جای که اسکی این شرایط رو داشت این کار رو کن و در غیر این صورت این کار و... ، چند جا پردازش متن هم دخیل کردم ، خلاصه طوری شد که خودم باید چند لحظه فکر میکردم تا می فهمیدم که این قسمت چیکار میکنه ! ، خوشحال ، خوشحال و خوشحال داشتم کار رو ادمه میدادم و دلم خوش بود که عجب کلیدی ساختم ! ، یک کلید تبادل 32 کارکتری امن ! ، که حتی برای برنامه های بعدیم نیازی نیست دوباره کد بزنم ، کافیه پترن | الگو رو عوض کنم ! ، بعد تو این فکر بودم که اصلا اگه جواب داد ، میتونم الگو رو داینامیک کنم ، مثلا اندروید ایدی ! ، اندروید آیدی بره به سرور و اونجا هم بشه کلید رو بدست آورد و در واقع کلید برای هر کاربر فرق داره ! ، بازم خوشحال و شاداب شروع کردم ادامه دادن کار ، obfuscate کردم ، دیدم ای دل غافل ! ، متد buildPublicKeyRunTime ام کاملا واضح هست ! ، فقط ساختار دستورات عوض شده (سینتکس قدیمی جاوا) کد رو کپی کردم تو محیط ایکلیپس ، دیدم یه ورودی بولین اضافه داره به نام isFlag پاک اش کردم ، اجرا کردم ، دیدم کلید ام رو خروجی داد ! ، البته این روش هم امنیت داره !!!!!!!!!!!
درسته امنه !!!
برای امن تر کردنش ، تصمیم گرفتن ، معیار های داینامیک بیشتری رو در گیر کنم ، مثلا TIME | زمان D:
md5 پسورد کاربر و ANDROID ID
با این حساب ، کسی که بخواد کلید تبادل رو بدست بیاره باید
- گذرواژه ی کاربر مورد نظر و MD5 گذرواژه را داشته باشد
- زمان در خواست را داشته باشد
- Android ID را داشته باشد
- الگوریتم را هم دیکد کرده باشد :)))
پــــــــــــــــــــــــــــــــس
کسی که MD5 رو داشته باشه ، 2 حالت داره ، یا اکانت خودشه ، یا به سرور نفوذ کرده ! اگه به سرور نفوذ کرده که دمش گرم ، خدا پشت و پناهش ، اما اگه اکانت خودش باشه ، که دیگه اکانت خودشه دیگه ، هر کاری میخواد بکنه :)))
امـــــــــــــــــــــــــــــــــــا
در بحث اطلاعات مالی مثل پروژه ی فعلی من که کاربر میتونه همه ی اطلاعات خودش رو ویرایش کنه به جز اطلاعات مالی !
فرض کنید من نفوذگر ! ، کلید رو با اون چیزایی که بالا گفتم به دست آوردم ( ایول دارم D: ) چون برنامه با اطلاعات مالی زیاد سر و کار داره ، میگم چرا هر دفعه کلی پول بدم ؟! ، میرم تو سرورش اکانت ام رو شارژ میکنم
بازم میرسم سمت کد obfuscate شده میبینم یه تابع chargeUserAccount دارم که با یه سری پارامتر و یه الگوریتم درخواست رو کد میکنه و در قالب یک sercureString به سرور پست میکنه
برای این مورد هم راه حلی که اندیشیدم (!) ، اینه که موقع شارژ حساب توکن پرداخت رو از برنامه بگیرم ، چک کنم ببینم آیا بازار تائید میکنه که بر اساس این توکن 50000 هزار تومان پرداخت شده ؟!
بعد دیدم بازار Verify نداره ، یعنی نمیشه از سرور درخواست داد به بازار که آیا این پرداخت موفق بوده یا نه ، ایمیل زدم به بازار ، گفتم شما این سرویس رو ارائه نمیدید و واقعا لازم هست ، اون خانومه که معمولا جواب میده ، ایمیل من رو فورواد کرده بود به علی و گفته بود "این چی میگه ؟! ، منظورش چیه ، واقعا ممکنه کسی درخواست جعلی به سرور بفرسته ؟!" ، علی هم در جواب به ایمیل من ، تمام این ها رو فوروارد کرده بود به من و گفت "در حال برنامه نویسی این سرویس هستیم و بزودی ارائه خواهد شد" ، حالا کاری نداریم که آیا واقعا درحال برنامه نویسی بودن یا من گفتم یادشون افتاده ! ، ولی بالاخره قراره اوکی بشه
خلاصه تو سرور میگیم بازار جان این پرداخت رو تائید میکنی ؟! ، اگه بگه آره مبلغ اش رو به حساب کاربر اضافه می کنیم !
بحث امنیت قطعا از این چیزا پیچیده تر هست ، میدونم خیلی نوشتم ، شاید طولانی ترین پاسخ ام باشه ! ، ولی ارزش اش رو داشت D:
امیداورم به درد یه نفر بخوره و یه دعایی هم واسه ما بکنه :)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .