صد رازِ نهان

یک شمع، با روشن کردن شمعی دیگر چیزی از دست نمی‌دهد!

۳ مطلب با کلمه‌ی کلیدی «JVM» ثبت شده است

جاواکارت-مقدماتی/4-من یک جاواکار نیستم!

قسمت قبلی: احراز هویت

در قسمت های پیشین به صورت اجمالی با تقسیم بندی کارت های الکترونیکی، استانداردهای کلی این حوزه و نحوه ی احراز هویت کارت ها آشنا شدیم. در این پست قصد داریم ابتدا به معرفی زبان‌های برنامه نویسی Cross Platform و سپس به بیان نحوه ی اجرای برنامه های جاوا و جاواکارت و مسیر پیش رو برای ساخت یک برنامه جاواکارت بپردازیم.

 

زبان‌های برنامه نویسی Cross Platform:

چنانچه از قبل آشنایی اندکی با یک زبان برنامه نویسی Cross-Platform (همان Multi Platform - همان Platform Independent) داشته باشید، باید عرض کنیم که زبان های جاوا و جاواکارت هم مانند پایتون سیاست تقریبا مشابهی را دنبال می‌کنند و جزو زبان های کراس پلتفرم به حساب می‌آیند. "کراس پلتفرم" بدین معناست که برنامه نویس فقط یکبار و برای همیشه برنامه‌ی خود را می‌نویسد و همان برنامه را بدون تغییر روی سیستم عامل‌ها و دستگاه های مختلف اجرا می‌کند. به صورت ملموس تر، برنامه نویس برنامه خود را به عنوان مثال روی سیستم عامل لینوکس می‌نویسد و یک فایل از آن می سازد، آنگاه همان فایل بدون تغییر کد، در لینوکس، ویندوز و سیستم عامل MAC اجرا می‌شود.

اما چگونه؟

در پاسخ به این سوال، ابتدا علّت این که برنامه های زبان هایی مانند C و ++C و سایر زبان های Native Platform(نقطه ی مقابل Cross Platform) باید برای هر سیستم عامل به صورت جداگانه Compile شوند را بیان می‌کنیم. علت این امر به صورت ساده این است که برنامه های نوشته شده به این زبان ها برای اجرا  روی سیستم عامل یک مرحله را طی می‌کنند و بعد به صورت مستقیم با سیستم عاملی که روی آن در حال اجرا می باشند تعامل می‌کنند و از آنجا که سیستم عامل های مختلف واسط های تعاملی و به بیان ساده تر زبان گویش تعاملی متفاوتی دارند، برنامه ای که برای گفتگو با یک سیستم عامل Compile(بخوانید "ساخته") شده است، قادر به صحبت با یک سیستم عامل دیگر نیست و باید مجددا به گونه ای که زبان سیستم عامل جدید را بفهمد Compile شوند. 


خب، در مقابل برنامه های زبان های Cross Platfrom چگونه اند؟ 

برنامه‌های این زبان‌ها به گونه‌ای می‌باشند که پس از این که برنامه نویس کد آنها را نوشت، برای اجرا شدن دو مرحله را طی می‌کنند؛ مرحله‌ی اول که توسط خود برنامه نویس انجام می‌شود، ساخت فایلی است که به عنوان ورودی موجودیتی به نام Virtual Machine استفاده می‌شود و مرحله‌ی دوم که توسط آن Virtual Machine انجام می‌شود خواندن فایل ورودی و ترجمه‌ی محتوای آن به زبان قابل فهم سیستم عامل است.

تصاویر زیر به روشنی نقش Virtual Machineرا در اجرای یک برنامه مشخص می‌کند: 

 



با توجه به تصاویر بالا، برنامه نویس‌های زبان های Cross Platform و Platform Dependent هر دو، برنامه های خود را یک بار می‌نویسند، ولیکن برنامه نویس زبان های Platform Dependent چند بار از آن فایل اجرایی می‌سازد. (در مواقع فراخوانی بعضی توابع سیستمی، هر دو گروه ناگزیر از ایجاد تغییراتی در کد برنامه ی خود نیز می باشند؛ هرچند با در نظر گرفتن بعضی نکات حین نوشتن برنامه می‌توانند، برنامه را از تغییر بی نیاز کنند.)

حال که با سیستم زبان های Cross Platform آشنا شدیم می‌توانیم علت انتخاب یک عضو از خانواده ی جاوا به عنوان زبان برنامه نویسی کارت های هوشند را بیان کنیم.


تاثیرات انتخاب جاواکارت به عنوان زبان برنامه نویسی کارت های هوشمند:

پیش از ارائه‌ی جاواکارت توسط شرکت Sun، تولیدکنندگان مختلف کارت های هوشمند هر کدام به صورت سلیقه ای استانداردی ارائه کرده بودند که منحصرا در اختیار افراد خاصی قرار می‌گرفت و برای یک برنامه نویس عادی، اولا در دسترسی نبود، و ثانیا به خاطر تعدد استانداردها یادگرفتن آن ها قابل پذیرش نبود. علاوه بر آن برنامه هایی که برای یک نوع کارت نوشته می‌شد، در صورت تمایل به ارتقای کارت یا تعویض کارت، دیگر قابل استفاده نبود و در اصطلاح Portability کافی نداشتند. با ظهور جاواکارت و پذیرش سازندگان مختلف به استفاده از این استاندارد و قرار دادن ماشین مجازی جاواکارت در کارت های خود، همه ی مشکلات فوق از بین رفتند و راه برای توسعه دهندگان نرم افزارهای کارت های جاواکارت یا همان توسعه دهندگان Appletها هموار شد. 


و اما:

قسمت 4: من یک جاواکار نیستم!

به عنوان یک مقدمه، روند نوشتن یک برنامه‌ی جاوا و سپس روند نوشتن یک برنامه‌ی جاواکارت را توضیح می‌دهیم، و از آن پس از شما انتظار می‌رود در خلال این مجموعه آموزش ها، به صورت Self-Study جاوا را بیاموزید.

برای نوشتن یک برنامه ی جاوا شما به یک IDE (= محیط برنامه نویسی =  Integrated Development Environment) مانند Eclipse یا Netbeans یا IntelliJ یا ... و همچنین به Java Development Kit نیاز دارید. 

سوال: Java Development Kit یا JDK چیست؟

جواب: گفتیم در زبان های برنامه نویسی Cross Platform یک ماشین مجازی وجود دارد که برنامه را از کاربر دریافت می کند و برای سیستم عامل ترجمه می‌کند. به صورت پیشفرض روی یک سیستم عامل نه آن Virtual Machine وجود دارد و نه ابزارهای لازم برای ساخت فایل ورودی آن ماشین مجازی. پس برنامه نویس باید هر دو دسته ابزار را به کامپیوتر خود اضافه کند. مجموعه ی ابزارهای مورد نیاز برای ساخت فایل و همچنین اجرای فایل های زبان جاوا، در یک مجموعه جمع آوری شده اند و نام آن مجموعه Java Development Kit است. شما می توانید با مراجعه به سایت Oracle این بسته را دانلود کنید(نیاز به فــــــــــیل‌ترشکن :دی). هنگام مراجعه به این سایت در کنار نسخه های مختلف JDK به بسته هایی با نام JRE نیز بر‌خواهید خورد. JRE یا Java Runtime Environment در واقع تنها قسمت دوم ماجرا می باشند! یعنی ابزارهای مورد نیاز برای اجرای فایل های جاوا! به بیان ساده تر JRE شامل JVM و یک سری ابزارهای خردِ دیگر است و به کاربران تنها اجازه ی اجرای فایل های جاوا را می‌دهد. برای درک نسبت JVM و JRE و JDK تصویر زیر را مشاهده کنید:


خیلی خب، پس از دانلود JDK و افزودن آن به IDE خود (IDEهای جدید به صورت خودکار این کار را برای شما انجام می‌دهند) شروع به برنامه نویسی می‌کنید. برنامه ای که نوشتید توسط IDE در ابتدا درون یک فایل با پسوند java. قرار می‌گیرد، و سپس با کلیک کردن روی یک دکمه، به صورت اتوماتیک به فایل class. و سپس به jar. تبدیل می‌شود و این فایل jar. فایلی است که هنگام کلیک شدن روی آن توسط کاربر، سیستم عامل آن را  به عنوان ورودی به JVM ارسال می‌کند.


سوال: روند نوشتن یک برنامه ی "جاواکارت" چگونه است؟

جواب: روند تقریبا مشابهی برای نوشتن برنامه های جاواکارت (یا همان اپلت ها) طی می‌شود. همانگونه که برای نوشتن یک برنامه ی جاوا به JDK نیاز داشتیم، برای نوشتن یه برنامه‌ی جاواکارت هم به JCDK یا همان Java Card Development Kit نیاز داریم (علاوه بر JDK). پس با مراجعه ی مجدد به سایت Oracle یک نسخه از JCDK را دانلود می‌کنیم. در حین انتخاب نسخه ی دلخواهمان باید این را در نظر داشته باشیم که برنامه های ساخته شده با یک ورژن، تنها روی کارت هایی که آن نسخه را پشتیبانی می‌کنند یا کارت هایی که نسخه های بالاتر را پشتیبانی می‌کنند قابل اجرا است.(جمله دوم معادل کلمه ی Backward Compatible می باشد. یعنی یک نسخه، برنامه های نسخه های قبلی را نیز اجرا می کند). پس از دانلود باید محتویات فایل فشرده را Extract کنیم و مسیر آن ها را به IDE  خود بدهیم. بعدتر خواهیم دید که Eclipse به صورت پیشفرض جایی برای دریافت آدرس JCDK ندارد. و بعدتر-تر خواهیم دید که با افزودن یک پلاگین به آن می‌توانیم این قابلیت را به آن اضافه کنیم. بعدتر ها باز خواهیم دید که:

  • پلاگین مذکور به صورت عادی فقط برای JCDK 2.2.2 طراحی شده است.
  • می‌توانیم با یک ترفند نسخه های قدیمی تر یعنی JCDK 2.2.1، JCDK 2.1.2 و JCDK 2.1.1 را نیز به کمک این Plugin استفاده کنیم.
  • نسخه های جدید نرم افزار Netbeans به صورت پیشفرض به JCDK 3.0.1 مجهز شده اند.
خب، بعد از مجهز شدن IDE دلخواه خود به نسخه ی JCDK مورد نظرمان، نوبت به برنامه نویسی می‌رسد. پس از نوشتن یک اپلت (که در پست های بعدی قدم به قدم آن را توضیح می‌دهیم) IDE مشابه قبل یک فایل java. تولید می‌کند که با چند کلیک این فایل ابتدا به class. و سپس به cap. (به جای jar.)  تبدیل می‌شود. تبدیل فایل java. به فایل class. را ابزارهای جاوا و تبدیل فایل class. به cap. را یکی از ابزارهای جاواکارت به نام Converter انجام می‌دهند. فایل cap. تولید شده، فایلی است که ما روی کارت بارگذاری و نصب می‌کنیم. در آینده به صورت جزئی تر با نقش Converter و سایر ابزارها آشنا خواهیم شد.


کوچ تا چند؟ مگر می‌شود از خویش گریخت؟
بال تنها غم غربت به پرستوها داد ....
۱۷ مهر ۹۴ ، ۱۸:۱۱ ۱ نظر موافقین ۰ مخالفین ۰
ابراهیم قاسمی

جاواکارت-مقدماتی/2-استانداردها + ساده سازی


استانداردها:

اما بعد! :دی 
معرفی استانداردها!
ما به صورت نا متناهی استاندارد داریم توی حوزه ی کارت های هوشمند و خصوصا سیمکارت ها. این استانداردها به سه دسته تقسیم میشن با اغماض:
  1. استانداردهایی که میان کانال ارتباطی رو از لحاظ فیزیکی بررسی میکنند که مثلا ولتاژ پایه ها باید اینقدر باشه و کلاک باید فرکانسش این باشه و .... یا فرکانس امواج الکترومغاطیسی برای کارت های غیرتماسی و .... ---> مهمترینش : ISO 7816 Part 3  برای کارت های تماسی و ISO 14443 برای کارت های غیرتماسی
  2. استانداردهایی که میگن مدیریت داخلی کارت باید به چه صورت باشه، مثلا حذف و نصب و تغییر کلیدرمزنگاری و ... به چه صورت هستش. ---> مهم ترینش : Global Platform برای هر دو نوع کارت های تماسی و غیر تماسی
  3.  استانداردهایی که (در واقع Specificationهایی که) APIهای جاواکارت، ویژگی های ویرچوآل ماشین جاواکارت و ویژگی های ران-تایم اِنویرومنت جاواکارت رو ارائه میدن. --> JCAPI Spec / JCRE Spec / JCVM Spec

سوال: جاواکارت با جاوا کارت فرق داره؟ :دی 
جواب: بله! جاواکارت زبون برنامه نویسی کارت هایی هستش که زبان "جاواکارت" رو ساپورت میکنند! و "جاوا کارت" همون کارت ها هستند. البته این نکته ای نیست که کسی رعایتش کنه، چیزی که باید مد نظرت باشه اینه که جاواکارت یه زبونه. :)

سوال: زبان های جاوا با جاواکارت خیلی تفاوت دارند؟ 
 جواب: هم بله هم خیر! خیر از این لحاظ که بالاخره ساختار زبان ها با هم یکی هستش و کسی که جاوا بلده، با یکم تقلا برنامه های زبان جاواکارت رو هم میفهمه. بله از این لحاظ که زبان جاواکارت به دو دلیل با جاوا تفاوت داره. دلیل اول این که قدرت سخت افزاری کارت ها با قدرت سخت افزار سیستم های معمولی قابل مقایسه نیست و بنابرین یه سری قابلیت ها از زبان جاوا حذف شده. مثلا جاواکارت ها فقط متغیر های نوع Byte و Short دارند (و int به صورت آپشنال)، در حالی که جاوا مغیرهای با سایز بزرگتر هم پشتیبانی میکنه. یا مثلا Clone کردن و ... از جاوا داخل جاواکارت نیستند. دلیل دوم هم این که به خاطر این که داخل کارت ما با حافظه ی  EEPROM و RAM به صورت غیر مستقیم سر و کار داریم و سرعت عملیات ها برامون مهمه، باید بتونیم حالت efficient بین تعریف کردن یه متغیر داخل یکی از این دو حافظه رو تشخیص بدیم.  (حافظه ی RAM موقتی هست،مقدار حجمش کمتره ولی سریع تره، حافظه ی EEPROM مقدار بزرگتری داره، کندتره و تعداد دفعات نوشتن و خوندن محدودی داره و تا پاک نکنیمش محتواش ماندگاره.)

 
 
بخش ساده سازی!

ببین عزیزم، جاواکارت رو به عنوان یه ساختمون n طبقه در نظر بگیر که پشت درب ورودیش یه سرایه دار نشسته و این سرایه دار از روزی که ساختمون ساخته میشه، تا روزی که ساختمون خراب میشه اونجاست و دو تا وظیفه داره! یکی این که هرکسی که میخواد بره توی ساختمون ساکن بشه یا کسی که ساکنه و میخواد از ساختمون بره بیرون، از این باید اجازه بگیره و کلا این کارای حمل و نقلش و خونه دادن بهش رو انجام میده. دوم این که اگه یه نفر از بیرون خواست چیزی بده به کسی که داخل ساختمونه و یا برعکس (ساکنین خواستند چیزی بدن به کسی که بیرون ساختمونه) این سرایه دار میشه واسطه!
حالا یعنی چی؟ 
کارت وقتی توی کارخونه ساخته میشه، یه اپلیکیشنی داخلش نصب میشه به اسم Card Manager یا Security Domain. این اپلیکیشن تا همیشه دیگه داخل کارت هست و از این به بعد اگه کسی خواست اپلِتی(به اپلیکیشن های روی کارت میگیم Applet) روی کارت نصب کنه، بایت-کدهاش رو به این میده و این براش نصب میکنه (همچنین واسه ی حذف یه روال مشابه طی میشه). همچنین اگه کسی خواست  دستوری/پیامی به یه اپلت روی کارت بفرسته، اول به این Card Managerمیگه من میخوام با فلان اپلت حرف بزنم، اگه Card Manager اجازه داد (اون اپلت وجود داشت، قفل نشده بود، رمز نمیخواست و...) اونوقت پیام رو میده باز به این کارت منیجر و کارت منیجر میده تش به اپلت و جواب رو میگیره و میده به کاربر بیرونی.



چه غم که عشق به جایی رسید یا نرسید؟

که آنچه زنده و زیباست، نفسِ این سفر است ...

#حسین منزوی

۱۲ مهر ۹۴ ، ۱۰:۴۹ ۲ نظر موافقین ۱ مخالفین ۰
ابراهیم قاسمی

جاواکارت-مقدماتی/1- مقدمه

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


مقدمه:
کارت های الکترونیکی از چند منظر تقسیم بندی میشند که مهم ترین این تقسیم بندی ها واسط ارتباطی و تراشه ی داخلی و سیستم عامل می باشد که بدون اتلاف زمان مستقیما به بیان این دسته بندی ها می‌پردازیم:

واسط ارتباطی(Interface):
  1. کارتهای تماسی (Contact-Card) --> مانند کارت تلفن و سیم کارت ها
  2. کارتهای غیرتماسی (Contactless-Card) --> مانند کارت های مترو
  3. کارتهای دو واسطی (Dual-Interface Cards) --> کارتهای هوشمند ملی که بنا است جایگزین کارت ملی شوند، از این نوع خواهند بود.
سوال: کارت های غیرتماسی چگونه کار میکنند و با کارتخوان ارتباط برقرار میکنند؟ 
جواب : دور تا دور داخل این بدنه ی لاستیکی کارت یک سیم پیچ قرار گرفته است و  هنگامی که کارت به محدوده ای از فضای اطراف کارت خوان نزدیک می‌شود به واسطه ی میدان مغناطیسی کارتخوان، درون این سیم پیچ ولتاژی القاء شده و انرژی لازم برای تراشه ی کارت را فراهم می‌کند. داده هایی که قرار است تبادل شوند، سوار بر یک سیگنال شده و به کارت/کارتخوان ارسال می‌شوند. البته ناگفته نماند که کارتهایی نیز وجود دارند که به صورت داخلی نیز دارای یک باتری می‌باشند، ولی در حال حاضر هیچ نمونه ی داخلی ای از این کارت‌ها نداریم و کاربردی هم ندارند. کارت های غیرتماسی از لحاظ فرکانس کاری و بُرد به انواع مختلفی تقسیم می‌شوند ولی از آنجا که اطلاع از این جزئیات در بحث‌های آتی ما تاثیرات چندانی ندارد، صحبت در این زمینه را به آینده موکول می‌کنیم.

سوال: Combo Card و Hybrid Cards؟ 
 جواب: کارت هایی که دارای دو واسط اند (= Dual Interface) به دو صورت می‌توانند ساخته شده باشند. حالت اول این که داخل کارت تنها یک تراشه وجود داشته باشد و هر دو واسط با آن ارتباط برقرار کنند، و حالت دوم این که داخل کارت دو تراشه ی مجزا وجود داشته باشد و هر واسط مستقلا تنها با یکی از آن‌ها دو تا مرتبط باشد (مشابه این که دو کارت که یکی تماسی و یکی غیرتماسی است را در یک پکیج قرار داده باشیم). 
 به یکی از این حالات Combo و به حالت دیگر Hybrid می‌گویند.

 سوال: کارت‌ها بانکی و کارت های بارکدی در کدام گروه قرار می‌گیرند؟ 
 جواب: کارت های بانکی یا مغناطیسی یا Magnetic Stripe یا اصطلاحا MagStripe و کارت های بارکدی اصولا نباید جزو کارت های الکترونیکی حساب شوند، ولی از آنجا که برای ارتباط با آنها سنسور کارتخوان مربوطه باید به صورت مستقیم و بدون واسطه با نوار مغناطیسی/خطوط بارکد ارتباط برقرار کند تا بتواند محتویات کارت رو قرائت کند، گروهی آن ها را جزو کارت های تماسی به حساب می‌آورند.

تراشه ی داخلی (Chip):
  1. کارت های حافظه یا Memory Cards یا Dump Cards --> مانند کارت تلفن و کارت مترو
  2. کارت های هوشند یا Smart Cards یا Cards with uProcessor --> مانند کارت هوشمند ملی یا سیمکارت ها.
سوال: یعنی کارت تلفن و کارت مترو به جز واسط ارتباطی، از لحاظ تراشه داخلی تفاوت دیگری ندارند؟ 
جواب: چرا! کارت های حافظه، به چهار دسته تقسیم می‌شوند، گروه اول تنها یک EEPROM ساده بدون هیچ مکانیزم امنیتی است (این نوع کارت ها دیگر تولید نمی‌شوند و تنها به صورت یک تراشه‌ی حافظه از آن ها بعضا روی مدارهای الکتریکی استفاده می‌شود). گروه دوم متشکل از یک حافظه و یه قسمت منطقی امنیتی است که به عنوان مثال اجازه نمی‌دهد محتویات حافظه از صفر به یک تغییر کنند و تنها اجازه ی تبدیل مقادیر یک به صفر می‌دهند، و یا این که به صورت یه شمارنده تنها امکان تعداد خاصی فرایند را برای کاربر فراهم می‌کنند (کارت های تلفن قدیم به احتمال زیاد از این مدل بوده اند). گروه سوم از یک حافظه و  یه قسمت منطقی امنیتی پیشرفته تر است که تنها با داشتن یه رمز سه الی پنج رقمی اجازه ی تغییر محتویات حافظه را فراهم می‌کنند (مانند کارت های تلفن فعلی- SLE4442/52). و در نهایت گروه چهارم به صورت یه حافظه و مکانیزم امنیتی پیشرفته است که هم ارتباط بین کارت و کارت خوان را رمز می‌کنند و هم اجازه ی تغییر یا خواندن محتویات حافظه تنها در گرو داشتن یه سری کلید احراز هویت به کاربر می‌دهند(مانند کارت های مترو).  
 

سیستم عامل (OS): 
* این تقسیم بندی همان طور که از اسمش مشخص است، خاص کارت های هوشمند می باشد.
  1. Java Cards (هدف این مجموعه پست ها)
  2. MultOS (نسبت به جاواکارت قیمت بالاتر و امنیت بالاتری دارد، دانش توسعه‌ی آن خیلی انحصاری است، دارای Community فعالی نیست، زبان برنامه نویسی اصلی آن C و Assembly است ولی کامپایلر بیسیک و جاوا هم  برای آن ساخته شده است و نمونه‌ی داخلی از آن نداریم).
  3. Windows Cards (مرسوم نیست).
  4. Native Cards (سایر کارت های هوشمند بدون سیستم عامل).

هرکه دلارام دید
از دلش آرام رفت ..
#حافظ دوست داشتنی
۰۷ مهر ۹۴ ، ۲۱:۱۵ ۱ نظر موافقین ۲ مخالفین ۰
ابراهیم قاسمی