ورود

View Full Version : لینک رمزی



rahele_sa
سه شنبه 23 خرداد 1385, 13:59 عصر
شاید ثا حالا همه شما شاهد لینکی همانند
http://www.barnamenevis.org/forum/attachment.php?attachmentid=3640&d=11481
موقع دانلود فایلی شده باشید که به نظر من کاری کردن که لینک اصلی مشاهده نشود .
بعضی از دوستان می گویند که این کار فقط در Phd قابل استفاده است .
از دوستان بخش توصعه ASP خواهشمند است اگر این امر در Asp.Net قابل استفاده است کمکی راجب تولید این لینک به جای لینک اصلی به ما نمایند .
در یک جا دیدم که تابعی به زبان VB واسه همین کار نوشته اند (در سایت های خارجی)
که شما لینک اصلی را به تابع می دادی
سپس آن تابع لینک را به صورت رمزی در می آورد
و از کاربر درخواست دانلود می کرد .

هدف من چیست ؟
فرض کنید ما چند تا فایل Wav مثل 1.Wav 2.Wav 3.Wav داریم
اگر کاربر فایل اول را با این لینک www.Rahele.Com/Waves/1.Wav از برنامه دانلود کند به راحتی می تواند دیگر فایل ها را بدون اینکه وارد برنامه شود دانلود کند (کافیست که شماره فایل را +1 کند یا بیشتر)

reza_rad
سه شنبه 23 خرداد 1385, 14:15 عصر
http://iranasp.net/Articles/ShowArticle.aspx?articleid=165

rahele_sa
سه شنبه 23 خرداد 1385, 15:34 عصر
http://iranasp.net/Articles/ShowArticle.aspx?articleid=165

این لینک کار نمی کنه error میدهد !

nazaninam
سه شنبه 23 خرداد 1385, 16:43 عصر
تا به حال به این فکر افتاده اید که یک سری اطلاعات را به صورت رمز در آورید و از دید کاربر پنهان کنید؟ برای مثال یک QueryString یا اطلاعات ذخیره شده داخل یک کوکی. گاهی هم بد نیست بعضی از اطلاعات داخل بانک اطلاعاتی خود را به صورت رمز ذخیره کنید تا در صورت سرقت آن، حداقل برخی اطلاعات حساس شما تا حدی محفوظ بماند. در این مقاله سعی میکنیم یک روش استاندارد برای به رمز در آوردن رشته ها را با هم مرور کنیم.

--------------------------------------------------------------------------------
برای اینکه همراه ما پیش بروید در VS.net یک پروژه جدید C# Application به صورت ASP.net Web Application ایجاد کنید. WebForm1.aspx به صورت پیش فرض در مقابل شما قرار میگیرد، از Toolbox یک Label داخل WebForm1 درگ کنید، به صورت پیش فرض نام آن Label1 خواهد بود.


معرفی Base64String

Base64String نوعی از String است (و با خصوصیات یک string معمولی) که کاربر نمیتواند آن را تشخیص دهد، (اگر کسی را میشناسید که میتواند به من هم بگویید!) برای مثال جمله "I LOVE ASP.net"، در Base64String میشود "SSBMT1ZFIEFTUC5uZXQ=". اما چطور؟


string String = "I LOVE ASP.net";
byte [] Byte = System.Text.Encoding.ASCII.GetBytes(String);
Label1.Text = Convert.ToBase64String(Byte);
در خط اول ما یک string معمولی را ساختیم در خط بعدی آن را به byte تبدیل کردیم و Byte نامیدیم، در خط سوم Byte را به صورت Base64String در آوردیم و توسط Label1 به نمایش در آوردیم. فکر خوبی است که عملیات رمز سازی را همین جا تمام کنیم چون Base64String برای کاربر معمولی قابل مشاهده نیست! اما اگر چند خط بالا را با این خط ها عوض کنیم چه میشود؟


string MyBase64String = "SSBMT1ZFIEFTUC5uZXQ=";
byte[] MyByte =Convert.FromBase64String(MyBase64String);
Label1.Text = System.Text.Encoding.ASCII.GetString(MyByte);

حدس بزنید نتیجه چه میشود؟! بله "I LOVE ASP.net"! در حقیقت ما همان راهی را که رفته بودیم برگشتیم! ابتدا Base64String را به byte تبدیل کردیم و سپس byte را به string معمولی. پس اگر برای ما مهم باشد که اطلاعات رمز شده ما برای کسی قابل بازگشت نباشد هنوز کارمان تمام نشده است. حالا که یاد گرفته اید با Base64String کار کنید بگویید:
"VHJ5IHRvIGZpbmQgd2hhdCB5b3UgbmV2ZXIgbG9vc2U= " چیست ؟! من جوابش را پیدا کردم و به صورت رمز در آوردم "jcUKVu8D4dlpy4BHw6bgefaVMWW9x0qV " جواب است ، امتحان کنید آن را به روش قبلی به string تبدیل کنید و ببیند آیا به جواب منطقی می رسید؟ برای رسیدن به جواب اصلی باید بتوانید آن را رمز گشایی کنید!


Cryptography با استفاده از TripleDES و MD5

در بالا با Base64String آشنا شدیم حالا وقت آن است که با یکی از روشهای معمول رمز سازی در دات نت آشنا شویم این روش فقط یکی از روشهای معمول رمزسازی در دات نت است برای آشنایی با روشهای دیگر از MSDN راهنمایی بگیرید . بیایید ابتدا با عبارتهای تازه‌ی این مبحث آشنا شویم:

TripleDES: برای رمز سازی سه بار از الگوریتم DES استفاده میکند.
DES: مخفف Data Encryption Standard.
MD5: یک الگوریتم کار آمد رمز سازی است که در بسیاری از زبانهای برنامه نویسی دیگر نیز و جود دارد. MD5 عضوی با نام ComputeHash دارد که یک تابع Hash یا (Hash function) است.

توابع Hash یا (Hash functions) یک binary string با طول دلخواه را به یک binary string با طول کوتاه و ثابت! تبدیل میکند، و این خاصیت را دارد که هرگز برای دو ورودی مجزا یک خروجی یک یکسان وجود نخواهد داشت (به عبارت دیگر توابع Hash تضمین میکنند که هر ورودی خروجی منحصر به فردی را داشته باشد). خوب برای به رمز در آورن کافی است مانند مثال زیر عمل کنیم (فعلا آن را اجرا نکنید!):



byte[] IV = new byte[8] {240, 32, 45, 29, 0, 76, 173, 59};
string cryptoKey = "All you need is Love";
string MyString = "I LOVE ASP.net";
byte[] buffer = System.Text.Encoding.ASCII.GetBytes(MyString);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
des.Key = MD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.Ge tBytes(cryptoKey));
des.IV = IV;
byte[] CodedBuffer = des.CreateEncryptor().TransformFinalBlock(buffer,0 ,buffer.Length);
Label1.Text = System.Convert.ToBase64String(CodedBuffer,0,CodedB uffer.Length);

ابتدا بگذارید ببینیم IV و cryptoKey چیستند؟
DESCryptoServiceProvider (و به دنبال آن TripleDESCryptoServiceProvider) دارای یک Key و یک IV مخفف Initialization Vector هستند که برای رمز کردن داده ها از آن استفاده میشود (همان طور که لازم نیست بدانیم کی برد و موس چگونه دستورات ما را به سخت افزار کامپیوتر منتقل میکنند تا از آنها استفاده کنیم، لازم نیست به دنبال این باشیم که Key و IV در DESCryptoServiceProvider دقیقا چگونه کار میکنند فقط کافی است بدانیم از آنها چطور استفاده کنیم). باید توجه داشته باشیم اگر فراموش کنیم IV را مقدار دهی کنیم در هنگام اجرا IV یک مقدار تصادفی خواهد گرفت که برگردان داده های رمز شده را غیر ممکن میکند!

در مثال بالا IV را از جنس byte تعریف کردیم و cryptoKey از جنس string به صورت "All you need is Love" مقدار دهی کردیم که در حقیقت "All you need is Love" کلید رمز ما خواهد بود. MyString همان stringای است که باید به صورت رمز در بیاید. (اگر کمی از #C سر در بیاورید با چند خط بعدی مشکلی نخواهید داشت).

des.Key: حالا وقت آن شده است که Key را مقدار دهی کنیم، اما باید آن را توسط MD5.ComputeHash به صورتی مناسب برای Key بودن تبدیل کنیم و فراموش نکنیم که MD5.ComputeHash، از string به عنوان ورودی نمیتواند استفاده کند و باید قبل از آن cryptoKey خود را به حالت byte تبدیل کرده باشیم (System.Text.ASCIIEncoding.ASCII.GetBytes(cryptoKe y)).

و حالا وقت خوبی است تا CreateEncryptor برای رمز سازی اقدام کند و TransformFinalBlock مقدار Hash شده‌ای برای منطقه مشخص شده ای از آرایه های byte مشخص شده حساب میکند. اما توجه داشته باشید که ما byte رمز شده لازم نداریم بلکه string رمز شده میخواهیم پس در قدم آخر باید یک Base64String تولید کنیم.

سوالی که پیش می‌آید این است که TripleDESCryptoServiceProvider و MD5CryptoServiceProvider کجا هستند؟ فضای نام System.Security.Cryptography پاسخ این سوال است پس حالا میتوانید پروژه‌ای را که ایجاد کرده بودیم بیاورید و به جای کد های قبلی کدهای مثال بالا را در آن قرار دهید و فراموش نکنید که namespace جدید را به صورت using System.Security.Cryptography به بالای کدهای خود اضافه کنید.

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


byte[] IV = new byte[8] {240, 32, 45, 29, 0, 76, 173, 59};
string cryptoKey = "All you need is Love";
string CodedString64 = "zNvKahC6S/+8xMX3o658wQ==";
byte[] buffer = Convert.FromBase64String(CodedString64);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
des.Key = MD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.Ge tBytes(cryptoKey));
des.IV = IV;
byte[] CodedBuffer = des.CreateDecryptor().TransformFinalBlock(buffer,0 ,buffer.Length);
Label1.Text = System.Text.Encoding.ASCII.GetString (CodedBuffer);

خوب حالا میتوانید به من بگویید "jcUKVu8D4dlpy4BHw6bgefaVMWW9x0qV " (که همان جواب معمای ما هم بود) چیست ؟ صد در صد خیر! مگر اینکه من به شما IV و Key آن را بگویم! IV مانند مثال و Key نیز "red rose" است! حالا اگر مطالب را دنبال کرده باشد احتمالا به راحتی میتوانید رمزگشایی کنید!

چند نکته امنیتی

آیا این روش، روش قابل اطمینانی است؟ باید بگویم تا وقتی نخواهید اطلاعات چند صد هزار دلاری یا اسناد محرمانه ای را به رمز تبدیل کنید احتمالا میتوانید روی آن حساب کنید مخصوصا که TripleDES سه بار با الگوریتم DES آن را به رمز تبدیل کرده است (سه بار رمز شکستن به راحتی سه بار رمز کردن نیست!).
شما میتوانید برای سخت تر کردن کار رمزشکن از Key های مختلفی استفاده کنید ( البته سعی کنید برای رمز کردن کلمه عبور، نام کاربری یا email را به عنوان کلید رمز قرار ندهید! چون شما جزو اولین 10000 نفری نیستید که این کار را کرده اند!). حفاظت اطلاعات شما در گروی امن بودن server ای است که سایت شما روی آن قرار دارد، همینطور از قرار دادن Key در Web.config به عنوان یک کار خلاقانه! جدا خودداری کنید.

titbasoft
سه شنبه 23 خرداد 1385, 17:58 عصر
http://www.barnamenevis.org/forum/showthread.php?t=19315

msakbari
سه شنبه 23 خرداد 1385, 19:31 عصر
با تشکر از جناب nazaninam .

یه سوال داشتم و اون اینکه واقعا کجاهای یه برنامه خوبه از این روش استفاده بشه خوب البته ما توسط یکسری کلاسهای پیش فرض می تونیم حتی خود فایل web.config رو رمزنگاری کنیم .

با این اوساف فکر نمی کنم زیاد استفاده از این روش در Asp.net لزومی داشته باشه ! لطفا در این مورد توضیحی بفرمایید .


مرسی

iekrang
سه شنبه 23 خرداد 1385, 19:34 عصر
با این اوساف فکر نمی کنم زیاد استفاده از این روش در Asp.net لزومی داشته باشه !
من از این روش برای کد کردن اطلاعات ارسالی توی queryString ام استفاده کردم.و واقعاً کاربرد داشت.

msakbari
سه شنبه 23 خرداد 1385, 23:07 عصر
به نظر من در مورد QueryString شاید خیلی جالب نباشه . اگه قراره یه اطلاعات خاص و محرمانه ای جابجا بشه خوب اصلا از QueryString عملا استفاده نمی شه .

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

لطفا یه کاربرد خوب از این کار در ASP.net اشاره کنید که ارزش پیاده سازی رو داشته باشه .

مرسی

reza_rad
چهارشنبه 24 خرداد 1385, 07:08 صبح
این لینک کار نمی کنه error میدهد !

nazaninam زحمتشو کشیدن گذاشتنش اینجا

سید مسعود موحد
چهارشنبه 24 خرداد 1385, 08:54 صبح
دوستان من فکر کنم توی VS2005 خودش این قابلیت را داره حتی میتونید با آدرس همان صفحه اول خود به تمام صفحات بروید بدون انکه URL شما تغییر کند
چند وقته که طرفش نرفتم یادم رفته میرم پیدا میکنم براتون میفرستم

Crestfallen
چهارشنبه 24 خرداد 1385, 09:29 صبح
شما در asp.net میتوانید از url mapping استفاده کنید .
در سایت www.developer.com جستجو کنید حتما به نتیجه میرسید

rahele_sa
چهارشنبه 24 خرداد 1385, 11:37 صبح
میشه بگید چی جستجو کنم

mp2009
جمعه 15 شهریور 1387, 00:54 صبح
UrlMaping دیگه . البته با Url Writing هم میشه.
هردوشون رو جستجو کن