PDA

View Full Version : ایجاد پسورد روی کلاس ها



Ghasem Dehghani
سه شنبه 22 خرداد 1386, 17:29 عصر
با سلام .
آیا راهی وجود دارد تا به کلاس هایی که تعریف میکنیم (فایل نهایی dll.)یک پسورد اختصاص داد تا فقط افرادی که پسورد آنرا میدانند بتوانند از آن استفاده کنند .(ترجیها طوری باشد که بتوان در ابتدای اجرای برنامه فقط یکبار پسورد را وارد کرد و در طول برنامه دیگر نیازی به وارد کردن آن نباشد .) لطفا راهنمایی کنید .
با تشکر .

once4ever
سه شنبه 22 خرداد 1386, 19:17 عصر
خوب میتونی یک متغیر public بذاری تو کلاست و هربار عملی از کلاست خواسته شد, مقدار اون متغیر چک بشه که آیا درست (کلمه شناسایی) هست یا نه. و فقط هم یکبار مقدار دهی کافیه

jafari_m246
سه شنبه 22 خرداد 1386, 19:38 عصر
سلام
من چطوری می توانم مطلب مورد نظرم را در این سایت پیدا کنم؟

jafari_m246
سه شنبه 22 خرداد 1386, 19:39 عصر
من درمورد c# چند تا سوال دارم

PC2st
سه شنبه 22 خرداد 1386, 20:09 عصر
من چطوری می توانم مطلب مورد نظرم را در این سایت پیدا کنم؟
در قسمت جستجوی سایت ( لینکش بالا هست )، درباره مطلبی که سوال داری، فقط کلمات مهمی که در سوالت وجود داره رو بنویس و روی دکمه جستجو کلیک کنید. اگر چیزی پیدا نکردید، یک تاپیک جدید برای سوالتون ایجاد کنید.




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

اگر چنین attribute ائی در دات نت پیدا نکردید، یک روش غیر قابل اطمینان و امنیتش در حد 5 درصد (!) به نظرم رسید که اگر خواستید ازش استفاده کنید:
یک کلاس abstract را در dll (یا assembly) خود جای دهید و تمامی کلاسهای دیگر که در این dll قرار دارند را از آن کلاس abstract به ارث برسانید. کلاس abstract که بعنوان یک کلاس پدر برای تمامی کلاسهای موجود در این dll عمل میکنه، براش یک متد سازنده ایجاد کنید که یک رشته رو بصورت ورودی دریافت کنه... رشته ورودی (توسط متد سازنده) رو با یک کلمه رمز مقایسه کنید (که بهتره این کلمه رمز رو با الگوریتم کد کنید و در حین runtime آنرا decode کنید) اگر با کلمه رمز برابر بود که هیچی، اما اگر برابر نبود مانع از ایجاد یک instance (شئ) از کلاس مورد نظر شوید مثلا سریعا تابع finalize یا ... رو صدا بزنید.

اگر دوستان از روش مناسبی اطلاع داشتند، دریغ نکنند...

MNosouhi
سه شنبه 22 خرداد 1386, 22:08 عصر
رجوع شود به فصل دوازدهم کتاب آقای هاشمیان ( که پی دی افش هم در سایت هست ) ، اونجا توضیح داده که چطوری یک جفت کلید تعریف کنی ، فایلت با یکی از کلید ها رمز میشه و فقط با کلید دوم از رمز خارج میشه ، پس فقط کسانی متونن استفاده کنن که کلید دوم رو داشته باشن.

PC2st
چهارشنبه 23 خرداد 1386, 00:34 صبح
از شما ممنونم ولی تا جائی که میدونم، جفت کلید ربطی به پسورد گذاری روی اسمبلی نداره.
به هنگام استفاده از جفت کلید، همواره کلید عمومی به همراه اسمبلی توزیع میشه (که در manifest قرار میگیره) و بیشتر شبیه به امضای دیجیتالی و کپی رایته... و همه میتونند ازش استفاده کنند ولی تنها کسانی میتونند تغییرش دهند که کلید خصوصی را داشته باشند.

ARA
چهارشنبه 23 خرداد 1386, 10:28 صبح
من تو برنامه هایی مثل janus دیدم که licence میگذارند
ولی تا حالا امتحانش نکردم

ولی یک چیزایی شو دیدم وقت هم نکردم تست کنم

Namespace: System.ComponentModel
کلاس License Class

MNosouhi
چهارشنبه 23 خرداد 1386, 11:24 صبح
به هنگام استفاده از جفت کلید، همواره کلید عمومی به همراه اسمبلی توزیع میشه (که در manifest قرار میگیره) و بیشتر شبیه به امضای دیجیتالی و کپی رایته... و همه میتونند ازش استفاده کنند ولی تنها کسانی میتونند تغییرش دهند که کلید خصوصی را داشته باشند.
ممنون ، ببخشید من تازه کارم ، برداشتم از اون قسمت کتاب اشتباه بود . از جوابتون ممنون.

PC2st
چهارشنبه 23 خرداد 1386, 16:07 عصر
من تو برنامه هایی مثل janus دیدم که licence میگذارند
ولی تا حالا امتحانش نکردم

ولی یک چیزایی شو دیدم وقت هم نکردم تست کنم

Namespace: System.ComponentModel
کلاس License Class
ممنون، درسته... فکر کنم همین باشه. کمی که از msdn خوندم، به نظر همین بود.
ولی فرصت نداشتم که کامل ببینم چی گفته ( امتحانات که فرصت نمیگذاره! ).

Ghasem Dehghani
جمعه 25 خرداد 1386, 08:53 صبح
با سلام خدمت دوستان .
اگر میشه با یک مثال کوچک و کاربردی توضیح بدین تا هم من و دیگر دوستان بیشتر متوجه نوع دستور و چگونگی کاربرد اون در کلاس ها بشیم .
با تشکر و سپاس فراوان .

PC2st
جمعه 25 خرداد 1386, 11:53 صبح
تا حدود کمی اطلاع دارم و امیدوارم در صورتی که دیگر دوستان وقت داشتند، جزئیاتش رو بیان کنند.

کلاس License یک کلاس abstract بوده که کلید حق اجازه استفاده از کلاس در آن قرار میگیرد.
برای قرار دادن و اعتبار لیسانس موجود، از متد LicenseManager.Validate استفاده میشه که خروجی این متد، یک شئ License است.

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

یک کلاس در دات نت که از کلاس LicenseProvider به ارث رسیده وجود داره که نامش LicFileLicenseProvider هست که یک فایل لیسانس رو مورد بررسی قرار میده و در صورتی که اون فایل مجاز بود، اجازه استفاده رو صادر میکنه. این فایل (فایل لیسانس) که توسط کلاس مذکور، مورد تجزیه و تحلیل قرار میگیره، باید فرمت بخصوصی داشته باشه:
1. نام فایل باید نام کامل کلاس به همراه فضای نام آن باشد.
2. در محتویات این فایل، باید عبارت بخصوصی وجود داشته باشد که الان با یک مثال توضیح میدم.

مثلا درصورتی که برای مشخص کردن معتبر بودن لیسانس از کلاس LicFileLicenseProvider استفاده کردید و کنترلی که ایجاد کردید نام کامل آن بهمراه فضای نامش مثل زیر بود:
MyNamespace.MyCustomControl
1. نام فایل لیسانس باید مثل روبرو باشد: MyNamespace.MyCustomControl.LIC
2. محتویات فایل لیسانس باید دقیقا مثل زیر باشد:


MyNamespace.MyCustomControl is a licensed component.

در اینصورت این فایل را در کنار خروجی نهائی قرار داده و مطمئن باشید در صورت کوچکترین تفاوتی با موارد بالا، کنترل هیچوقت اجاز استفاده شدن در RunTime را نخواهد داد.

فایل License را برای کلاس ایجاد کردیم اما در واقع کنترل (کلاسی که ایجاد کرده ایم) آماده نشده تا با یک لیسانس معتبر کار کند.
باید مثل زیر کلاس (کنترل) که ایجاد کرده ایم را آماده کنیم تا فقط تحت یک لیسانس معتبر کار کند، پس attribute و کدهای لازم را به کلاس خود اضافه میکنیم:


[LicenseProvider(typeof(LicFileLicenseProvider))]
public class MyCustomControl : TextBox
{
private License license = null;
public MyCustomControl()
{
license = LicenseManager.Validate(typeof(MyCustomControl), true);
}
protected override void Dispose(bool disposing)
{
if(disposing)
{
if(license != null)
{
license.Dispose();
license = null;
}
}
}
}

با نگاهی به کلاس بالا، متوجه مهم ترین مورد یعنی attribute ائی بنام LicenseProvider میشویم که پارامتر آن کلاسی است مشتق شده از LicenseProvider که معتبر بودن لیسانس را مورد بررسی قرار میدهد و ما از کلاس ساده LicFileLicenseProvider که در دات نت موجود است، استفاده کرده ایم. مورد دیگر، فیلدی است بنام license که در سازنده کنترل (کلاسی که ایجاد کرده ایم)، به کمک متد LicenseManager.Validate مقدار دهی میشود و در صورتی که لیسانس معتبر نبود، با یک error، مانع از ایجاد instance از کلاس (کنترلی که ایجاد کرده ایم) میشود.

پس اگر کلاس (کنترلی که ایجاد کرده اید) را به مانند کلاس بالا، آماده کنید که با یک لیسانس معتبر کار کند و کنترل (کلاسی که ایجاد کرده اید) خود را کامپایل کنید و در یک برنامه مورد استفاده قرار دهید، تنها در صورتی در زمان run Time اجازه استفاده را دارد که فایل لیسانس ذکر شده، در کنارش وجود داشته باشد.

همانطور که ملاحظه کردیم، کلاس LicFileLicenseProvider یک لیسانس خیلی ساده ایجاد میکند که حتی با Notepad میشه یک لیسانس معتبر برای کنترل (کلاس که ایجاد کرده ایم) ایجاد کرد... اما اگر خودمون از کلاس LicenseProvider به ارث برسونیم و با الگوریتم خاص، نوع لیسانس را مورد بررسی قرار بدیم، حداقل با Notepad (!) نمیشه برنامه رو کرک کرد (!).

PC2st
جمعه 25 خرداد 1386, 13:24 عصر
راستی، این لیسانس میتونه برای DesignMode یا RunTime باشه و توضیحات بیشتر با سورس:

http://www.codeguru.com/csharp/.net/net_framework/licensing/article.php/c5469/