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

این رابط های کاربردی برنامه نویسی با توجه به نکات زیر طراحی شده اند :

1- مستقل از پیاده سازی(Implementation Independence): لازم نیست برنامه ها خودشان امنیت را پیاده سازی کنند و به جای این کار آنها می توانند خدمات امنیتی را از محیط جاوا درخواست کنند، این خدمات توسط "ارائه کننده هایی " ( به این نکته اشاره خواهیم کرد ) پیاده شده اند و توسط رابط های استانداردی به محیط جاوا متصل می شوند . یک برنامه ممکن است از چندین ارائه کنندۀ مختلف برای عملیات های امنیتی در برنامه استفاده کند .

2-( Implementation interoperability ) سازگاری پیاده سازی : ارائه کننده برای تمامی برنامه ها سازگارند و به طور خاص هیچ برنامه ای وابسته به یک ارائه کنندۀ خاص و یا هیچ ارائه کننده ای وابسته به یک برنامۀ خاص نمی باشد .

3- توسعه یابی الگوریتم ها (Algorithm extensibility) : محیط جاوا شامل تعدادی ارائه کننده های پیش ساخته ای است که مجموعه ای از خدمات اولیه امنیتی را پیاده سازی کرده اند و در حال حاضر به صورت گسترده ای مورد استفاده هستند . اما بهر حال ممکن است برخی برنامه ها بخواهند از استانداردهای امنیتی استفاده کنند که بر روی محیط جاوا به صورت پیش فرض موجود نباشد بنابراین محیط جاوا به شما اجازه می دهد تا ارائه کننده های امنیتی جدیدی را نصب و از آنها استفاده کنید .

- ارائه کننده های امنیتی :
کلاس java.security.provider معرف مفهوم ارائه کننده های امنیتی در محیط جاوا می باشد . این کلاس نام و لیست خدمات امنیتی پیاده سازی شده توسط ارائه کننده را مشخص می کند .
هنگامی که یک خدمت امنیتی توسط برنامه در خواست می شود ، محیط جاوا بر اساس اولویت ارائه کننده هایی که آن سرویس را پیاده سازی کرده اند, آن سرویس را به برنامه ارائه می کند .
برنامه ها می توانند از متد get Instance( ) مربوط به کلاس های امنیتی ، سرویس امنیتی مورد نظر خود را دریافت کنند . برای مثال یک برنامه می تواند با فراخوانی متد getInstance( ) کلاس java.security.MessageDigest به پیاده سازی خاصی از الگوریتم های دایجست کردن پیغام ها مانند MD5 دسترسی پیدا کند :
MessageDigest md = MessageDigest.getInstance (˝MD5˝);
شکل زیر ساختار امنیتی جاوا را نشان می دهد :
شما می توانید مشخصه های امنیتی پیش فرض محیط جاوا را تغییر دهید . این مشخصه ها به صورت پیش فرض در فایلی با نام java.security و در شاخۀ lib/security مسیری قرار دارد که شما محیط اجرایی جاوا (JRE) را در آنجا نصب کرده اید . هم چنین شما می توانید به صورت پویا و در زمان اجرای برنامه ها با استفاده از متدهای کلاس java.security.Security این مشخصه را تغییر دهید .
هم چنین تمام ابزار آلات و دستوراتی که در این مقاله به آنها می پردازیم در شاخۀ bin از مسیر نصب JRE موجود است .

- کریپتو گرافی :
معماری کریپتوگرافی جاوا محیطی است برای دسترسی و توسعه قابلیت های کریپتوگرافیک در محیط جاوا – این محیط شامل رابط های کاربردی برنامه نویسی برای طیف گسترده ای از خدمات کریپتوگرافیک است که موضوعات زیر را شامل می شود :
- الگوریتم های دایجست کردن پیام
- الگوریتم های امضای دیجیتالی
- رمز نگاری متقارن
- رمز نگاری نامتقارن
- رمز نگاری بر پایۀ کلمۀ عبور (PBE)
- کریپتوگرافی محذوف غیر خطی (ECC)
- الگوریتم های توافق کلید
- مولدهای کلید
- کدهای تشخیص هویت پیام ها

رابط های کاربر برنامه نویسی کریپتوگرافی در دو پکیج
javax.crypto , java.security قرار دارند.
محیط جاوا شامل تعدادی از ارائه کننده های پیش ساخته برای بسیاری از الگوریتم های کریپتوگرافیک پر استفاده مانند ,RSA, DSA, DES, AES الگوریتم های رمز نگاری ARCFOUR ، الگوریتم های دایجست کردن پیام مانند MD5 و SHA-1 و الگوریتم توافق کلید Diffie-Helman می باشد .

این ارائه کننده های پیش فرض این الگوریتم ها را به زبان جاوا پیاده کرده اند .
هم چنین محیط جاوا شامل یک سری ارائه کننده ها است که به صورتی پلی با اجزای امنیتی سازگار با استاندارد PKCS#11 عمل می کنند.

- زیر ساخت کلید عمومی:
زیر ساخت کلید عمومی اصطلاحی است که معرف محیطی جهت تبادل ایمن اطلاعات بر پایه کریپتوگرافی کلید عمومی می باشد . این محیط به هر هویتی ( مانند افراد ، سازمان ها، و...) اجازه می دهد یک گواهی نامه دیجیتالی داشته باشند و ابزارآلاتی برای تأئید هویت توسط این گواهی نامه ارائه می کند .
زیر ساخت کلید عمومی کلیدها ، گواهی نامه ها، کریپتوگرافی کلید عمومی و مراکز اعتبارسنجی قابل اعتمادی را که گواهی نامه را ایجاد و آنها را به صورت دیجیتال امضاء می کنند شامل می شود .
محیط جاوا شامل رابط های کاربردی برنامه نویسی است که گواهی نامه های دیجیتالی بر پایۀ استاندارد X.509 را حمایت می کند ، این رابط های کاربردی برنامه نویسی در دو پکیج java.security.cert , java.security قرار دارند .

ذخیره سازی گواهی نامه و کلید :
محیط جاوا مکانیزمی برای ذخیره سازی طولانی مدت کلیدها و گواهی نامه ها ارائه کرده است که اصطلاحاً به آن انباره های کلید و یا گواهی نامه می گویند . به طور خاص کلاس java.security.KeyStore معرف یک انبارۀ کلید می باشد و کلاس java.security.cert.CertStore معرف انبارۀ گواهی نامه های دیجیتالی می باشد . پیاده سازی این دو کلاس با توجه به نوع آنها متفاوت است . محیط جاوا شامل استانداردهای ذخیرۀ کلید PKCS12 , PKCS11 و روش براساس فایلی برای ذخیره سازی کلیدها با نام (Java Kes store)JKS می باشد .

پیاده سازی KeyStore که بر اساس استاندارد PKCS11 می باشد به برنامه های جاوا این امکان را می دهد که به کلیدها و گواهی نامه های ذخیره شده بر روی سخت افزار های ایمن ( مانند کارت های هوشمند) دسترسی داشته باشند ، توجه داشته باشید که ممکن است کلیدهای کارت های هوشمند اجازۀ خارج شدن از دیوایس را نداشته باشند و در چنین مواردی می توان از اشیائی از نوع java.security.Key به عنوان ارجاعی به کلید استفاده کرد (که البته این ارجاع شامل تمام جزئیات کلید اصلی نیست )
به طور کلی دو ابزار پیش ساخته برای کار با کلیدها ، گواهی نامه ها و انبارها وجود دارد :
ابزار Keytool (در شاخۀ bin محل نصب JDK) که برای ایجاد و مدیریت انبارها مورد استفاده قرار می گیرد و می تواند :

- کلیدهای زوج عمومی / خصوصی را ایجاد کند .
- ذخیره و بازیابی گواهی نامه های استاندارد X.509 را انجام دهد .
- ساخت درخواست گواهی نامه (PKCS#10) جهت ارسال به مراکز اعتبارسنجی گواهی نامه را انجام دهد.
- ذخیره پاسخ گواهی نامه ها را انجام دهد.
و ابزار Jarsigner (در شاخۀ bin) که برای امضای دیجیتالی فایل ها JAR و هم چنین بازرسی فایل های JAR امضاء شده مورد استفاده قرار می گیرد .

- تصدیق هویت :
همانگونه که از نام آن بر می آید ، تصدیق هویت فرآیند تشخیص هویت یک کاربر می باشد . محیط جاوا رابط های کاربردی برنامه نویسی رائه کرده است که برنامه را قادر می سازد که تصدیق هویت کاربران را از طریق واحدهای login قابل اتصال به برنامه ها انجام دهند ، برنامه ها از کلاس javax.security.auth.LoginContext برای این منظور استفاده می کنند ، این کلاس نیز به نوبۀ خود از یک فایل پیکربندی برای مشخص کردن نوع واحد login که نمونۀ پیاده سازی شدۀ رابط (javax.security.auth.spi.LoginModule) استفاده می کند.
از آنجایی که برنامه ها منحصراً با کلاس LoginContext در ارتباطند ، بنابراین کاملاً مستقل از نوع واحد Login هستند و با عوض کردن واحد Login نیازی به تغییر برنامه اصلی نمی باشد و واحد جدید به صورت غیر مستقیم به هر برنامه ای قابل اتصال است .
شکل زیر ساختار برنامه ها و محیط تصدیق هویت را نشان می دهد :

محیط جاوا واحدهای login از پیش ساختۀ زیر را ارائه کرده است که در پکیج com.sun.security.auth.module می باشند:
- Krb5LoginModule که تصدیق هویت را با استفاده از پروتکل های Kerberos انجام می دهد
- JndiLoginModule جهت تصدیق هویت با نام کاربردی / کلمۀ عبور و با استفاده از پایگاه های , LDAPیا NIS .
- KeyStoreLoginModule جهت ورود به هر نوع انبارۀ کلیدی مانند انبارهای سخت افزاری PKCS#11

-
ارتباط ایمن :
داده ها در طول مسیرشان در شبکه می توانند توسط افرادی که دریافت کنندۀ واقعی اطلاعات نیستند مورد دسترسی قرار گیرند . هنگامی که داده ها شامل اطلاعات خصوصی و یا امنیتی مانند کلمۀ عبور و یا شمارۀ کارت های اعتباری باشد باید مراحلی برای غیرقابل فهم بودن اطلاعات برای افراد غیرمجاز اعمال گردد. از طرف دیگر اطمینان حاصل کردن از اینکه اطلاعات برای مقصد مورد نظر (با هویت واقعی) ارسال می شود و اینکه داده ها در طول مسیر تغییر پیدا نکنند نیز بسیار حائز اهمیت است .

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

SSL/TLS:
محیط جاوا رابط های برنامه نویسی کاربردی برای پروتکل های TLS و SSL ارائه کرده است که قابلیت هایی چون رمزنگاری ، اطمینان از صحت اطلاعات ، تصدیق هویت سرور و تصدیق هویت کاربر( در صورت نیاز ) را شامل می شود .
به طور کلی برنامه ها می توانند از پروتکل های SSL/TLS برای یک مسیر ایمن انتقال داده ها بر روی هر پروتکل چون HTTP استفاده کنند .
کلاس javax.net.ssl.SSLSocket معرف یک سوکت شبکه است که قابلیت های پروتکل SSL/TLS را کپسوله کرده است .

SASL :
"لایۀ امنیتی و تصدیق هویت سهل" موسوم به SASL یک استاندارد اینترنت است که با مشخص کردن یک پروتکل و یک لایۀ امنیتی بین کاربر و سرور تبادل اطلاعات را انجام می دهد . این
پروتکل چگونگی تبادل داده های مربوط به تصدیق هویت را مشخص می کند ولی خود این داده ها را مشخص نمی کند .
رابط برنامه نویسی کاربردی SASL در جاوا کلاس ها و رابط هایی را برای برنامه هایی که می خواهند از مکانیزم های SASL استفاده کنند ، ارائه کرده است . این رابط برنامه نویسی به گونه ای تعریف شده است که مستقل از مکانیزم باشد ، و بنابراین برنامه هایی که از این رابط های برنام نویسی استفاده می کنند وابسته به مکانیزم SASL خاصی نیستند . کلاس javax.security.sasl.Sasl برای ایجاد اشیائی از نوع SaslServer , SaslClient استفاده می شود .
مکانیزم های SASL از ساختار ارائه کننده ها که قبلاً به آن اشاره شد استفاده می کنند و محیط جاوا به صورت پیش ساخته ارائه کننده ای دارد که مکانیزم های SASL زیر را حمایت می کند:
مکانیزم های ساده سمت کاربرد سرور CRAM-MDS,DIGEST-MD5,GSSAPI, EXTERNAL

کنترل دسترسی :
معماری کنترل دسترسی در محیط جاوا از منابع مهم (مانند فایل های محلی) و کدهای برنامه ها حفاظت می کند .
تمام تصمیمات مربوط به کنترل دسترسی از طریق یک مدیر امنیتی که معرف آن کلاس
java.lang.Security Manager می باشد گرفته می شود .یک مدیر امنیتی باید در زمان اجرای نصب شده باشد تا کنترل دسترسی ها فعال شود .
اپلت ها در جاوا به صورت پیش فرض از یک مدیر امنیتی استفاده می کند ولی برنامه های جاوا به صورت پیش فرض دارای مدیر امنیتی نمی باشد ، اگر برنامه ای بخواهد از مدیر امنیتی استفاده کند یا در کد برنامه و یا استفاده از متد java.lang.System.setSecurityManager( ) این کار را انجام دهد و یا از پارامتر خط فرمان زیر استفاده کنیم:
-D java.security.manager

اجازه ها :
هنگامی که کدهای جاوا توسط یک کلاس لودر بارگذاری می شود ، کلاس لودر به صورت خودکار اطلاعات زیر راجع به کد را استخراج می کند:
- کدها از کجا بارگذاری شده اند
- چه کسی کد را امضا کرده است (اگر کد امضاء دیجیتالی شده باشد)
- اجازه های پیش فرضی که کد برنامه با آنها موافقت کرده است

مکانی که کد از آن بارگذاری شده است با یک
URL ، امضاء کنندۀ کد توسط زنجیرۀ گواهی نامه های امضاء کننده و اجازه ها توسط اشیائی از کلاس java.security.Permission مشخص می شوند .
توجه کنید که هویت کاربری که برنامه را اجرا می کند در زمان بارگذاری کلاس ها در دسترسی نمی باشد و این وظیفۀ برنامه است که کاربر را تصدیق هویت کند (با استفاده از تکنیک های تصدیق هویت که به آنها شاره شد)

خط مشی
(policy) :
همانطور که قبلاٌ اشاره شد ، مجموعۀ محدودی از اجازه ها در زمان بارگذاری کلاس ها تأیید می شوند ، شما این امکان را دارید که به صورت کاملاً انعطاف پذیری و با استفاده از یک خط مشی امنیتی اجازه های دیگری را مدیریت کنید .

این قابلیت توسط کلاس
java.security.Policy ارائه شده است . در هر لحظه از اجرای برنامه تنها یک شیء از کلاس Policy می تواند نصب باشد . وظیفۀ اصلی شیئی از کلاس Policy تشخیص این موضوع است که آیا دسترسی به منبع محافظت شده ای (بر اساس محلی که کلاس از آنجا بارگذاری شده است و کسی که آن را امضاء کرده است و شخصی که در حال اجرای برنامه است ) امکان پذیراست یا خیر.

محیط جاوا پیاده سازی پیش فرض از کلاس
Policy ارائه کرده است که این اطلاعات را از فایل های با پسوند properties می خواند.

این فایل ها باید تمام اجازه هایی که برنامه دارد را شامل شود.
برای ایجاد فایل خط مشی می توان یک ویرایش گر متنی ساده و یا ابزار policytool (شاخۀ bin از نصب JDK ) استفاده کرد .
برای مثال اگر در برنامه ای شخصی بخواهد برای مثال فایل C:\Test.txt را بخواند شما می توانید به صورت زیر بررسی کنید که آیا او چنین اجازه ای دارد یا خیر:

Permission perm = new java.io.FilePermission(˝C:\Test.txt˝, ˝read˝);
SecurityManager sm = System.getSecurityManager ( );
If (sm != null)
Sm.checkPermission (perm);


ترجمه با دخل و تصرف از: امیر صدری نیا
(گروه آموزشی پردازش تفکر فردا)
http://nazdik.net/artview.php?id=17&type=1
__________________