1397/09/13 21:18 رمزنگاری و فعالسازی برنامه در سی شارپ بر اساس تاریخ
booysusa

 
درود بر همگی
من یک برنامه ساده نوشتم و میخوام طوری رمزنگاریش کنم که مثلا فقط یکسال قابل استفاده باشه و پس از گذشت یکسال دوباره سریال جدید بخواد
لطفا راهنمایی کنید
آموزش فرادرس خریدم ولی متاسفانه فایده ای نداشت و فقط فعالسازی رو آموزش داده بود، من میخوام برنامم یک سال یا مثلا 6 ماه پس از اولین استارت دوباره فعال سازی بخواهد


مشخصات برنامه من:
سی شارپ
ویژال استودیو 2015
دیتابیس اس کیو ال کامپکت
ویندوز فرم
1397/09/14 1:24
حاجی شریفی
مؤسس سایت
 
سلام
جواب شما به نوعی شامل دو بخش میشود.

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

دوم) مشکل تشخیص تاریخ روز
به فرض من تاریخ پایان کار نرم افزار را قطعی و امن داشته باشم.
چطور بفهمم امروز چه تاریخی است؟ واز تاریخ موعود عبور کرده ام یا نه؟

بخش اول با یک فایل XML (یا JSON) و مفاهیم امضاء دیجیتال به راحتی و با اطمینان بالا قابل حل است.

اما بخش دوم در شرایط مختلف ، حالات و امکان پیاده سازی متفاوتی دارد.
پس اجازه دهید ابتدا بخش دوم را بررسی و تحلیل کنیم...

راه حل اول)
اگر طوری باشد که برنامه نیاز مدام به اینترنت و آنلاین بودن داشته باشد، به راحتی میتوان زمان فعلی را از سرور گرفت
(مانند برنامه های شبکه های اجتماعی ، برنامه های بانک ها، بازی های آنلاین و...و...)

اگر برنامه آفلاین باشد و بدون نیاز به اینترنت کار کند به ناچار باید تاریخ را از خود رایانه بگیرید.
ولی مشکل آنجاست که کاربر میتواند تاریخ رایانه را به عقب باز گرداند !

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

فرض کنید برنامه حسابداری خریده ام که فقط 1397.09 الی 1397.10 فعال است.
اگر من تاریخ رایانه را دستکاری کنم، تمام اطلاعات مالی من ، خرید ها و فروش ها و... فقط در بین بازه فوق قابلیت ثبت شدن دارند و من نمیتوانم به همین شکل برای یکسال از این برنامه استفاده کنم، برنامه دیگر برایم ارزشی ندارد.

راه حل سوم)
اگر برنامه آفلاین است و تاریخ محور هم نیست، کار کمی سخت میشود.
باید بجز معیار زمان، برای محکم کاری بیشتر یک معیار "تعداد اجرا" هم داشته باشید.
نیاز نیست به کاربران بگویید ، ولی اگر برنامه ای قرار است 30 روز کار کند، شما یک محدودیت 1000 باز اجرا هم برای آن قرار دهید.

باید یک فایل رمزنگاری شده نگاه دارید که همواره آخرین تاریخ اجرای برنامه و همچنین تعداد دفعات اجرای برنامه را نگاه دارد.
این فایل با هر اجرا باید update شود.
برنامه باید به محض اینکه یکبار کشف کرد ، تاریخ سیستم expire شده یا تعداد دفعات اجرای برنامه گذشته است، باید مورد را در فایل ذخیره کند.

ودر نهایت هم همواره امکان دارد که کاربر فایل فوق را backup گرفته و restore کند تا برنامه مجدد به کار ادامه دهد.
برنامه باید تاریخ های created/modified/accessed را هم درون خود فایل نگهداری کند وبا مقادیر خود سیستم فایل مقایسه کند.
برای اطمینان بیشتر میتوانید در چند محل دیگر هم اطلاعاتی ذخیره کنید، مثلا کلیدی را در registry هم نگاه دارید!
برای اطمینان بیشتر، برنامه میتواند هرزمان اجرا بود و اینترنت گیرآورد ( با لجاجت و پررویی تمام! ) یکبار هم زمان و لایسنز را از اینترنت/سرور خودش بررسی کند.
و...
و...

میتواند به یک حد نسبی از رضایت برسید ولی برنامه آفلاین ، زمان-دار، همواره امکان استفاده طولانی مدت را دارد.
فقط باید کسی وقت بگذارد و راهش را پیدا کند.

=====

بجای وابسته کردن برنامه به زمان ، میتوانید برنامه را به قابلیت های مختلف در آن وابسته کنید.
یعنی کسی که 1 تومان بدهد، میتواند با 5 ویژگی/feature برنامه کار کند.
کسی که 5 تومان بدهد، میتواند با 10 ویژگی/feature برنامه کار کند.
و...
در نهایت هم میتوانید با امکانات بیشتر ، کاربر را برای نسخه ها وبروز رسانی های بعدی و فروش نسخه های بعدی ، ترقیب کنید.

این موارد از نظر فنی با درصد اطمینان بیشتری قابل انجام است.
فقط کافیست زمان را حذف کنید!

اجازه دهید اگر من نسخه v1/Home برنامه تان را خریدم، تا هر وقت خواستم آن را داشته باشم.
بجایش با امکانات بیشتر ، من را به خرید v2 یا نگارش Pro و... ترقیب کنید.

موفق باشید.
1397/09/14 8:24
booysusa

 
بسیار سپاس جناب شریفی واقعا عالی توضیح دادید و ممنون بابت وقتی که گذاشتید
من نگرانم برخی به همان امکانات کم راضی باشند، بنظرتون برنامه پس از هر 50 بار استفاده فرم لاگین اینترنتیش لود شود، خوب هست؟ منظورم لاگین اینترنتی هست (نمیدونم دقیقا اسمش چی هست ، هاست فکر کنم) البته با طراحی همین هم مشکل دارم و هنوز اموزش را فرا نگرفته ام
مثلا از طریق هاست برسی کند که ایا یوزرنیم و پسورد وارد شده صحیح هست یا خیر
در هاست هم تنظیم کنیم که مثلا این یوزرنیم و پسورد یکسال اعتبار دارد!؟
1397/09/15 18:16
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
بنظرتون برنامه پس از هر 50 بار استفاده فرم لاگین اینترنتیش لود شود، خوب هست؟
...
در هاست هم تنظیم کنیم که مثلا این یوزرنیم و پسورد یکسال اعتبار دارد!؟

بله، این هم بد نیست و قابل انجام است. فقط نیاز به یک برنامه کوچک در سرور هم دارید که استعلام از دیتابیس و پاسخ دهی را انجام دهد، که خیلی سخت نیست.

ولی فراموش نکنید که اینها همه جزء راه حل سوم است.
و در هرصورت باید در جایی این 'عدد' را نگه دارید.
رمزنگاری هم سرجایش، ولی اگر من دیتا/فایل قبلی را پیدا کنم و backup بگیرم ، درنهایت میتوانم محدودیت 'زمان' و 'تعداد-اجرا' را دور بزنم.
که البته میتوان با افزایش شروطو پردازش ها و... کار را برای هکر احتمالی بسیار سخت کرد.


برای بخش اول)
اگر میخواهید چیزی را از سرور اینترنتی خودتان به برنامه بفرستید و مطمئن باشید کسی نمیتواند در محتویات آن تغییری ایجاد کند وخودتان هم درون برنامه نمیخواهید آن را 'عوض/update' کنید، (مانند آنکه برنامه تا چه تاریخی کار کند) میتوانید از RSA و مفهوم امضای دیجیتال استفاده کنید که در تاپیک زیر توضیحات مختصری وجود دارد و نمونه کدی هم جهت دانلود ارائه شده.
رمزنگاری نامتقارن با الگوریتم RSA

اگر خودتان میخواهید چیزی را ذخیره کنید و باید مدام 'عوض/update' اش هم بکنید (مانند اینکه تا حالا چندبار برنامه اجرا شده و...) میتوانید از رمزنگاری متقارن AES استفاده کنید.

فعلا یک مطالعه ای روی بخش ساده تر که مربوط به رمزنگاری است داشته باشید، شاید تا بیایید بخش اول را تکمیل کنید، ایده های بهتری هم به ذهن تان برسد.
1397/09/18 9:6
booysusa

 
آقای شریفی من میخوام به این برنامه مثلا یک قفل رمزنگاری بزارم که کاربر پس از گذشت 1 سال دوباره نیاز به فعالسازی داشته باشه
من فقط تیکه کد تاریخ انقضا رو بلد نیستم، اگر امکانش هست یه جوری انجامش بدید ممنون میشم
مثلا بعد از هر 30 بار باز کردن برنامه، برنامه سایت time.com را بررسی کنه و اگر تاریخ از اون حد لایسنس رد کرده بود خطا بده و اگرم نت وصل نبود که به سایت time.com وصل بشه به کاربر خطای اینترنت رو بده

یا اینکه من بتونم یک وب داشته باشم و یک دیتابیس بر روی وب برای بررسی لایسنس ها و اعتبار سنجی اون لایسنس ها
لینک دانلود
1397/09/19 23:17
حاجی شریفی
مؤسس سایت
 
سلام
باز باید تاکید کنم که هرکاری انجام شود، (مثلا همن شمارش تا 30 بار) بالاخره باید در جایی ذخیره شود.
اگر کسی بداند تعداد اجراها را کجا ذخیره میکنید، میتواند از آن کپی بگیرید و مدام آن را برگرداند، درنتیجه این 30 بار تا ابد ادامه خواهد یافت.

واقعا وقت خالی ام خیلی کم است...
چون بنظر میرسد ، سوال به دادن نمونه کد رسیده، اجازه دهید تا آخر هفته (پنجشنبه-جمعه) که شاید وقت بیشتری داشته باشم ، چیزی برایتان حاضر کنم.
1397/09/23 20:14 پروژه نمونه صدور فایل لایسنز برای برنامه های سی-شارپی و Trial کردن برنامه تولیدی
حاجی شریفی
مؤسس سایت
 
سلام
یک نمونه خیلی ساده برایتان درست کردم.

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

بسته دانلودی شامل دو پروژه است.
پروژه SampleApp که یک ماشین حساب خیلی ساده است
پروژه فوق برای کارکرد هم نیاز به فایل لایسنز سرور دارد و هم تعداد اجراهای خود را نگاه میدارد و یک If ساده بررسی میکند که این مقدار کمتر از 10 برابر تعداد روزهای trial باشد! طبیعتا شما میتوانید آن را باشرط دلخواه خود عوض کنید.
این پروژه در صورت عدم اجرا یک Code از سخت افزار رایانه جاری میدهد تا کاربر برای آن Code اقدام به دریافت لایسنز کند.
در واقع فایل لایسنز فقط روی یک رایانه کار خواهد کرد.

اطلاعات لایسنز در فایل License.lic نگهداری میشود که xml ای با یک امضاء سفارشی است، این فایل غیرقابل جعل است.

اطلاعات تعداد اجرا در فایل Setting.bin نگهداری و با الگوریتم AES رمزنگاری میشود، این فایل به کپی شدن ضعف دارد و اگر کپی شود و مجدد بعد چند روز paste شود ، تعداد اجرای برنامه به اعداد قدیم باز میگردد!
برای سخت شدن میتوان نسخه یا هش ای هم در registry یا در مکان دیگری هم در هارد نگه داشت و...

پروژه دوم LicenseGenerator است.
این پروژه Code را از SampleApp گرفته و برای یک محدوده زمانی مشخص یا نامحدود فایل License.lic برای آن سخت افزار تولید میکند.

هر دو پروژه WPF هستند ولی این نکته مهمی نیست! فقط ریختن و خواندن مقادیر از چند TextBox است... تفاوتی ایجاد نمیکند.
بطور مثال فرق خاصی نمیکند و خیلی راحت میتوان LicenseGenerator با همین کدها در وب و با ASP.Net پیاده سازی کرد.
یا SampleApp با همین کد میتواند WinForm باشد و...


نسخه کامپایل شده ای از هر دو برنامه در پوشه DEMO وجود دارد.
پیشنهاد میکنم قبل از خواندن کدها، برنامه را از این پوشه اجرا کنید و تلاش کنید با LicenseGenerator فایل را ساخته و در کنار برنامه SampleApp کپی کنید ...

تلاش کنید برنامه را فعال کنید و ببینید برنامه ها چطور عمل میکنند؟اگر تاریخ رایانه را تغییر دهید چه رخ میدهد؟ و...
سپس کدها را در VS2017 مشاهده کنید، اینطوری گمانم بهتر متوجه عملکرد کدها خواهید شد.

کدفعلی را خیلی با عجله حاضر کردن ، دلم میخواست بیشتر امتحانش میکردم ولی فرصت بیشتری ندارم، Test صحت کارکردش با خودتان.
دانلود دوپروژه:
LicenseSample.zip

شب خوش.
18 روز پیش
booysusa

 
بسیار بسیار سپاسگذارم جناب آقای شریفی
لطف کردید
متاسفانه به دلایلی یک ماهی نبودم با اینکه این کار برام خیلی واجب بود و هست، تست میکنم و پاسخ میدم خدمتون
سپاسگزارم