هشت روز پیش رمزنگاری و فعالسازی برنامه در سی شارپ بر اساس تاریخ
booysusa

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


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

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

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

بخش اول با یک فایل 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 و... ترقیب کنید.

موفق باشید.
یک هفته پیش
booysusa

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

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

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


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

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

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

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

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

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