ایجاد لایسنس ، شماره سریال
سلام
من یه برنامه می خوام بنویسم و می خوام براش لایسنس یا یه کد فعال سازی بزارم چند مورد هست :
یکی اینکه چه روشی بهتر از همه هست .
اول اینکه چه جوری کد اول و چه جوری کد دوم رو که از سریال اول به دست میاد .
باید توجه داشت که می خوام مثلا فایل نصب برنامه توی هر سیستم دارای یه شماره سریال خاص باشه و وقتی که سریال دوم رو میدیم فقط روی همون سیستم جواب بده البته فکر کنم بهترین راه حل این باشه که شماره سریال اول از تلفیق شماره هارد و این چیزا به دست بیاد .
و یه چیزه دیگه فرض کنید کد تولید شده . حالا می خواهیم که مشتری پس از پرداخت مبلغی کد اول رو بده و کد دوم رو بگیره . می خوام ببینم میشه همه ی این کارا رو به صورت آنلاین انجام داد . از پرداخت مبلغ تا دریافت کد .
یه چیز دیگه که مثلا برنامه ۳۰ روزه باشه . روز شمار داشته باشه و نشون بده که چند روز باقی مانده . و اینکه بعد از حذف و نصب برنامه این تعداد روز ها از دست نره . همین طور بعد از عوض کردن ویندوز هم اگه بشه دیگه عالی میشه .
راه حل های ثبت نرم افزار و صدور مجوز استفاده از نرم افزارها در VS.net
سلام
چندی پیش یه دوستی تو همین تالار این سوال رو کرده بود اما به نتیجه قطعی نرسید, در همون موقع تلاش مختصری کردم که روش مناسبی برای حل این مشکل که هم دنبالشن پیدا کنم. متاسفانه بدلیل ذیق وقت به اخر نرسید و به حال خود رها شد .... حالا دوباره همون سوال و همون مشکلات ... امروز که به این پست رسیدم به خودم گفتم دوباره موضوع رو از سر بگیرم انشاء الله این دفعه تکمیل بشه ... بار هم به دلیل کمبود وقت تا چند روزی نمی تونم براش وقت بذارم ولی تا 3 روز اینده سعی م یکنم روش کار و حل مشکلی که در این بین دیده میشد رو مطرح کنم شاید در کنار دوستان بتونیم به نتیجه قابل اطمینانی برسیم, یه راهنمای مختصری که قصد اتمام آنرا داشتم نیز نوشتم اما بنابه دلایل ذکر شده در بالا چندان جلو نرفت :41:............... اینها رو به عنوان مقدمه کار قرار می دم تا 3 روز دیگه بریم سر کدها و سایر مسائل
به امید خدا
راه حل های ثبت نرم افزار و صدور مجوز استفاده از نرم افزارها در VS.net
هدف از طراحی هر نرم افزار کوچک یا بزرگی استفاده از آن توسط کاربر یا کاربران نهایی است.در این میان استفاده رسمی از نرم افزار, مطلوب طراحان یا توزیع کنندگان اصلی بوده و ضعف در این زمینه می تواند منجر به فروپاشی تمامی طرح و برنامه های از پیش تعیین شده باشد. البته ذکر این نکته نیز قابل توجه است که امنیت مطلق برای هیچ سیستمی تعریف نشده است و رسیدن به آن در حال حاضر غیر ممکن است.
با توجه به بافت خاص فرهنگی و حقوقی که در ایران موجود است, پشتیبانی موثری در حوزه استیفای حقوق تولید کننده وجود ندارد و اگر هم اسما موجود باشد راه حل چندان مناسبی در شرایط فعلی نیست و بازدارندگی مطلوبی هم ندارد. لذا در مرحله اول بار پشتیبانی همچنان بر روی دوش طراحان و توسعه دهندگان نرم افزار است. عدم وجود قانون کپی رایت در کشور و ضعف های بیشمار اموزشی و فرهنگی در این امر توسعه دهندگان نرم افزار را وا می دارد تا تا با صرف هزینه های هنگفت حداقل امنیت لازم را فراهم آورند, در حالیکه کاملا واضح است که این رویکرد چندان موثر نیست. تفکیک نرم افزار به دو دسته داخلی و خارجی و صرفا حمایت از دسته داخلی نیز با شکست موجه شده است, چرا که اصل موضوع یکسان است و برای کسی که استفاده از نرم افزارهای خارجی را نیک می پندارد با گذشت زمان همین رویه را برای نرم افزارهای داخلی نیز بکار می گیرد. لذا توسعه حداقل امنیت, در دسترسی و استفاده از نرم افزارها حتی با وجود قانون کپی رایت کاملا منصفانه و منطقی است.
هدف اصلی از این نوشتار بررسی راهکارهای موجود و در حد توان ره یافت های مقابله با آنها است. البته دور از انتظار نیست که در این امر به نتیجه کاملا ایمنی نیز نرسیم اما سعی می شود از شرایط و امکانات موجود بهترین استفاده را ببیریم. گرچه این موضوع در حوزه تکنولوژی دات نت کاملا حجیم و می توان چندین کتاب در باب آن نوشت اما کمبود زمان و تجربه آنرا بسیار خلاصه می کند. در پایان از تمامی دوستانی که می توانند ایده های موثری در این زمینه داشته باشند تقاضا می شود میدان را خالی نگذارند تا همه بتوانیم از آن استفاده ببریم.
هدف کلی ما روش هایی برای محدود کردن کاربران غیر قانونی در استفاده از برنامه های نوشته شده در محیط ویژوال استدیو دات نت است, گرچه روشن است که تعریف امنیت فقط در این سطح کاملا سطحی است. همچنین در این راستا می توانیم برنامه های بسازیم که شمایی از برنامه اصلی هستند و صرفا برای مقاصد اموزشی و معرفی بکار می روند تا کاربران با امکانات و ابزارهای برنامه ما آشنا شوند. راهکارهای مناسبی نیز ارائه می شوند تا از استفاده کاربران غیر مجار جلوگیری کنیم و آنها را مجبور به ثبت نرم افزار کنیم.
حفظ امنیت در برنامه های تحت دات نت صرفا محدود به مباحث بالا نمی شود و ایجاد امنیت یکپارچه را باید در تمامی مسیر طراحی و توسعه رعایت کرد که در زمان حاضر بر روی آن بحث نمی کنیم, شاید در یک فرضت مناسب تر به گوشه های از آن اشاره کردم.
با توجه به در خواست یکی از دوستان همین انجمن که چند روز پیش نوشته بود و تقاضا داشت تا رویکردی برای ثبت نرم افزار در برنامه مورد نظر خودش داشته باشد, این بحث رو دنبال کردم تا سایرین نیز استفاده ببرند.
قبل از هر چیز لازم است نگاهی به تاریخچه کسب مجوز برای استفاده از نرم افزارها داشته باشیم تا روال کار بهتر قابل درک باشد. در روزهای اولی که تکنولوژیهای کامپیوتری پا به عرصه ظهور گذاشتند عملا هیچ گونه راهکاری برای مسئله کسب مجوز نبود, سیستم های کامپیوتری عمومی نبودند و کسانی هم که با آنها کار می کردند تکنسین های متخصص و دارای مجوز بودند که با دستگاههای بسیار بزرگ و حجیم سروکله می زدند, افراد عادی هم به این سیستم ها دسترسی نداشتند بنابراین عملا نیازی به صدور مجوز هم نداشتند. اما بعد از گذشت چندین سال, شرایط به کلی تغییر کرد. کامپیوترها به شرکت های ریز و درشت راه پیدا کردند و در اندک زمانی بسیاری از خانه ها صاحب یک کامپیوتر رومیزی شدند که نیاز اصلی آنها نرم افزارهای رنگ وارنگ برای کارهای مختلف بود. در این زمان کاربران نه تنها تکنسین نبودند بلکه قشر کثیری از آنها هم قانونا مجوز استفاده از بسیاری از نرم افزارها را نداشتند ............ توسعه دهندگان نرم افزار با این شرایط باید در فکر راه و چاره ای برای محدود کردن انتشار غیر قانونی و استفاده بدون مجوز توسط کاربران می شدند. به هر حال مسئله ای به اسم Licencing بوجود امد که معنای و مفهومش نیز همراه با ریشه کلماتش بود (برگرفته از کلمات Li به معنی دروغ گفتن و Cense که از کلمه سنت امریکایی گرفته شده است ) در مجموع معنای آن می شود دروغ گفتن درباره واحد بسیار کمی از پول.
در اولین و ساده ترین قدم فقط موافقت نامه هایی بین توزیع کنندگان نرم افزار و خریداران رد و بدل می شد که خریدار متعهد به رعایت مفاد موافقت نامه می گردید. با گذشت زمان مشخص شد که صرفا تائید لفظی یک نرم افزار چندان چاره ساز نیست لذا توسعه دهندگان نرم افزار راه حل جدیدی را برای تفکیک کاربران دارای مجوز و کاربران سارق پیدا کردند. یعنی اختصاص کلیدهای عبور منحصر به فرد برای هر کاربر. با این استراتژی تا حدودی شرایط بر وفق مراد توسعه دهندگان نرم افزار چرخید اما زیاد دوام نیاورد. اعجوبه های عجیب و غریبی که نام کرکر به خود گرفته بودند نرم افزارهای گران قیمت چند هزار دلاری را در چند سوت لخت نموده و در پناه دنیای وب در سراسر دنیا پخش می کردند. جدالی که هنوز هم پابرجاست و بازار نرم افزار کشورهای جهان سوم ( خودمان هم که مشتری پروپا قرص این کهنه بازار بوده و هستیم) به مدد آن دارای جنب و جوش خاصی شده است. گرچه این نفوذها همیشگی هستند اما دلیلی برای دنبال نکردن تکنولوژی های امنیتی نیست و ما در حد توان خود برای آن باید برنامه ریزی داشته باشیم. به قول ما ایرانی ها (کار از محکم کاری عیب نمی کند)
معمولی ترین حالت برای ثبت نرم افزارهایی که همه روزه از آنها استفاده می کنیم, بدین صورت است که پس از نصب نرم افزار بر روی سیستم, اولین قدم برای استفاده از برنامه داشتن یک کلید اجازه عمومی است که معمولا به آن کلید رمز یا Password می گوییم. در صورتی که کلید رمز ما معتبر باشد (یعنی بصورت قانونی یا غیر قانونی آنرا بدست آورده باشیم) مجوز استفاده از برنامه به ما داده می شود و در غیر اینصوت برنامه اصلا کار نمی کند یا بصورت دمو بوده و بسیاری از امکانات موجود را برای ما غیر فعال می کند و ممکن است حالت سومی نیز داشته باشد که تا دوره زمانی خاصی کار کند و پس از آن بصورت های مختلف اعلان اتمام زمان استفاده را بکند(مخل آرامش مغز).
در صورت استفاده از رویه بالا, تولید کنندگان نرم افزار نیاز به راهی برای تولید کلید رمز یکتا دارند. برای تولید کلیدهای رمز معمولا 3 روش دنبال می شود :
- حالت اول : در این حالت صرفا یک کلید رمز با توالی خاصی تولید می شود که با شاخص های دیگری مانند ID محصول یا ورژن آن ترکیب می شود. مهمترین مزیت این نوع کلیدهای رمز راحتی فرایند ساخت انها است و برنامه نیز نیاز به منطق پیچیده ای برای سنجش اعتبار رمز ندارد, در واقع برنامه فقط فرمت صحیح کلید رمز را چک می کند. عیب اصلی این روش هم در این است که براحتی می توان فرمت تولید کلید های رمز را تشخیص داد و سریال های معتبر جدیدی مشابه با آن ساخت.
- حالت دوم : استفاده از کلیدهای رمز هش شده که با استفاده از یک شماره سریال اصلی یا فرمول خاص ساخته میشوند. در این حالت منطق اعتبار سنجی کلیدهای رمز ورودی نیز پیجیده تر از حالت قبل است و در صورتی که به فرمول ساخت کلیدها دسترسی نداشته باشیم فهمیدن منطق آنها پیچیده می شود. با استفاده از یک الگوریتم هش خوب می توان کلیدهای رمز مناسبی با سطح وسیع تولید کرد. در این حالت نیز ممکن است کلید به همراه ترکیبی با سایر شماره ها باشد. مانند سریال بعضی محصولات مایکروسافت
- حالت سوم : در این روش کلیدهای رمز بر اساس یک شماره سریال که معمولا در زمان اجرا بدست می آید ساخته می شوند. در واقع کلید رمز نهایی وابسته به کلید اولیه است. می توان شماره سریال سخت افزارهای کامپیوتر را نمونه ای از این دست دانست که نسبتا منحصر به فرد هستند و رمز تولید نیز یکتا باقی می ماند حالت دیگری نیز ممکن است مطرح شود, در این حالت ممکن است طراح نرم افزار از ما بخواهد از طریق کامیپوتری که قرار است برنامه نصب شود با اینترنت متصل شده و کلیدهای فعال سازی دریافت شود. در این حالت نیز تولید کلید ممکن است بر اساس IP یا سریال های سخت افزاری باشد..
گرچه تمامی روش های بالا در نهایت راهی برای دورزدن دارند اما ایجاد اختلال در راه رسیدن به آن و یا طولانی نمودن پروسه گذر از این مرحله می تواند نسبتا نقش موثری داشته باشد.
یک حالت دیگر برای حفظ امنیت نیز وجود دارد که کاربر برای فعال سازی و استفاده از برنامه ها نیاز به فلش مموری متصل به سیستم دارد تا برنامه بتواند اعتبار مجوز را با آن بسنجد, در ایران این سیستم بیشتر با نرم افزارهای مالی دیده می شود که از حوصله بحث ما خارج است و به آن نمی پردازیم.
نرم افزار ما که در محیط ویژوال استدیو نوشته شده (من از VB استفاده می کنم) فرم خاصی برای ثبت دارد که تا زمان ورود رمز صحیح از ورود کاربر به برنامه جلوگیری می کند. و بدون پشت سر گذاشتن آن راهی برای ورود به برنامه نیست.
خوب حال سوال این است که در پشت این فرم ها چه می گذرد و اعتبار سنجی چگونه صورت می گیرد, رمز ها چگونه و بر اساس چه اسلوبی تولید می شوند, پس از این که برنامه بصورت قانونی ثبت شد برنامه چگونه آنرا تشخیص بدهد. و در نهایت با چه رویکردی از آن حفاظت بعمل آید. به عبارتی باید دنبال این سوالات باشیم.
1 - رمز مورد نیاز کاربر را چگونه تولید کنیم که توسط برنامه معتبر تشخیص داده شود؟
2 - برنامه چگونه رمز ارسالی کاربر را اعتبار سنجی کند؟
3 - اگر رمز معتبر بود, چگونه به برنامه تفهیم کنیم که در مراجعات بعدی کاربر, از وی درخواست رمز نکند؟
در نهایت هم ممکن است سوال چهارمی پیش بیاید که :
اگر قرار است که برنامه ما بصورت زمانی کار کند چگونه گذشت زمان و رسیدن به نقطه پایانی را مشخص کنیم؟
حال که نیازهای ما مشخص شدند, به هر کدام می پردازیم
تولید رمز برای برنامه های نوشته شده تحت ویژوال استدیو دات نت (2005 تا 2010) : البته ذکر این نکته قابل توجه است که منظور ما از تولید کلید رمز صرفا تولید سریال رمز نیست بلکه تولید فایل های لایسنس هست که دربردارنده کلید رمز می باشند و برای فعال سازی برنامه بکار می روند و مستقیما هیچ کلید رمزی نمی سازیم.
فایل های لایسنس تولید شده بصورت فایل های xml هستند که بصورت مجزا در کنار برنامه اصلی قرار می گیرند و برنامه ما نیز با خواندن محتویات فایل های لایسنس اعتبار آنرا چک می کند. هر فایل لایسنس نیز شامل یک امضاء دیجیتال است. امضاء دیجیتال بر اساس رمزسازی کلید عمومی-اختصاصی (public-private key encryption) تولید می شود. با این حساب هر زمان که برنامه ما اجرا می شود مبادرت به خواندن فایل لایسنس می کند, اگر فایل لایسنس وجود نداشته باشد یا محتوی داده های غیر معتبر یا امضاء غیر معتبر باشد واکنش مناسب را از خود نشان خواهد داد.
نوع برنامه های که می خواهیم سیستم لایسنس را برای آن طراحی کنیم فرقی نمی کند چه باشد, به هر حال ما برنامه داریم به نام application که باید سیستم مناسبی برای لایسنس ان طراحی کنیم.
فایل لایسنس که در بالا اندکی در موردش نوشتیم بصورت فایل xml است که در قدم اول دربردارنده مشخصات عمومی است و شمای کلی آن بصورت زیر است. فرایندی که امضاء دیجیتال را نیز می سازد, امضاء را بصورت رمز شده در داخل همین فایل لایسنس قرار می دهد.
<?xml version="1.0"?><License> <Product>application</Product> <LicenseDate>1/1/2000</LicenseDate> <ExpireDate>12/31/2999</ExpireDate> <CoveredVersion>1.*</CoveredVersion> <Licensee>m anvar.net</Licensee> <SerialNumber>LIB-123456789</SerialNumber>
<Signature> Digital signature appears here (not shown) </Signature></License>
تگ های LicenseDate و ExpireDateابتدا و انتهای تاریخ معتبر لایسنس را مشخص می کنند, تگ Licensee مشخص کننده نام خریدار لایسنس است. تگ SerialNumber محتوای شماره سریال تعریف شده توسط فروشنده است که با این لایسنس یکتا همراه می شود. نگ CoveredVersion نیز مشخص کننده ورژن کنونی برنامه است که مشابه با اسمبلی تولید شده توسط ویژوال استدیو است, هر ورژن دارای 4 نقطه است که مشخص کننده چهار قسمت حائل می شود. مثلا ورژن 1.2.3.4 از سمت چپ به راست : عدد 4مشخص کننده ورژن عمده یا major, عدد 3 مشخص کننده ورژن کوچک تر یا minor , عدد 2 مشخص کننده توالی ساخت یا build و عدد 1 هم مشخص کننده ورژن تجدید نظر شده است. هر مولفه می تواند عددی بین 0 تا 9999 یا علامت * ستاره باشد. علامت ستاره مشخص می کند که مکان مورد نظر دارای مقادیر معتبر است.
قسمت Signature هم مکان امضاء دیجیتال تولید شده است, فرمت این قسمت وابسته به ابزارهای کریپتوگرافی xml در دات نت است که این قسمت را تولید می کنند. یعنی اگر برای تمامی فایل های لایسنس از یک برنامه تولید کننده فایل لایسنس استفاده کنیم فرمت امضاء دیجیتال همگی آنها مشابه هم خواهد بود. برنامه تولید کننده فایل لایسنس یک جفت کلید عمومی و اختصاصی می سازد که برای امضاء کردن دیجیتال بکار می روند. قسمت عمومی این کلید که بصورت فایل xml است باید بعنوان یک منبع (resource) با نام LicensePublicKey به برنامه اصلی اضافه شود. قسمت اختصاصی آن نیز باید بصورت خصوصی نگه داشته شود. برای مجکم کاری این جفت کلید ها باید تا زمان عمر برنامه اصلی نگهداری شوند. مکان فایل لایسنس را نیز می توان در بخش setting برنامه اصلی قرار داد تا بهتر بتوانیم انرا مدیریت کنیم. می توان برنامه اصلی را جوری نوشت که در صورت نیافتن فایل لایسنس در پوشه های برنامه به دنبال آن بگردد.
تولید فایل لایسنس
برای تولید فایل های لایسنس ما نیاز به برنامه مجزایی داریم که منحصرا کارش تولید فایل های لایسنس است و باید مستقل از برنامه اصلی باشد. برنامه تولید لایسنس دارای سه مولفه اصلی است :
- کلیدهای عمومی و اختصاصی که در فرایند امضاء مورد استفاده قرار می گیرند را می سازد و مدیریت می کند
- کاربر را برای تاریخ لایسنس, تاریخ انقضاء , ورژن برنامه, نام لایسنس و شماره سریال برای یک لایسنس واحد به فعالیت وا می دارد.يعني با توجه به ورودي هاي بالا كليدها را توليد مي كنيم.
- فایل xml لایسنس را تولید کرده و با استفاده از کلید اختصاصی بصورت دیجیتالی آنرا امضاء می کند.
حال برنامه تولید لایسنس را می سازیم. این برنامه دو فرم دارد. فرم keyform برای تولید یا پیدا کردن کلیدهای عمومی- اختصاصی که در فرایند امضاء دیجیتال بکار می روند. فرم دوم LicenceGeneration است که فایل های لایسنس نهایی را برای مشتری تولید می کند.
فرم keyform وظیفه پیدا کردن مسیر یا ساختن کلیدهای عمومی اختصاصی را بر عهده دارد. فرم LicenceGeneration نیز وظیفه ساخت فایل لایسنس بر اساس جفت كليدهاي عمومي اختصاصي برای کاربر نهایی را بر عهده دارد. وظیفه این فرم در ابتدا مطمئن شدن از سالم بودن فایلهای کلید عمومی خصوصی و پس از ان اطمینان از صحت اطلاعات ورودی کاربر است.
ادامه دارد ....:27: