الگوی امنیتی به کار گرفته شده در چیچک

21 04 2009

چیچک یک مشکل امنیتی داشت و اون این بود که گذرواژه‌‌های وب‌سایت‌های مختلف رو به صورت ناامن ذخیره می‌کرد. خب برای رفع این ضعف من مدتی روی الگوریتم‌های مختلف کار کردم تا در نهایت این مشکل رو حل کردم.

من از الگوریتم AES استفاده کردم. این توضیح رو بگم که AES یه الگوریتم رمزنگاری متقارنه به این معنی که داده‌ها به یک کلید رمزنگاری می‌شه و با همون کلید، رمز گشایی.

خب مشکل استفاده از این الگوریتم این بود که نمی‌شد به حافظه‌ی کاربر اعتماد کرد و کلید ۱۶ بایتی این الگوریتم رو به حافظه‌ی کاربر سپرد. خب راه حل بهتری (و البته نه غیر قابل نفوذ، مثل بقه‌ی الگوریتم‌های ایمن) که من استفاده کردم این بود که برای هر کامپایل از کاربر بخوام که کلید ذخیره شده توی سورس کد رو تغییر بده و برنامه رو کامپایل کنه. من هم برای نسخه‌ی باینری یک کلید رو وارد می‌کنم و اون رو پیش خودم نگه می‌دارم. خب، به نظر راه حل ایمنی بود، نه؟

اما جاوا نویس‌ها می‌تونن برای رمز نگاری کردن یک جریان داده‌ی ورودی به نام inputStream اینطور عمل کنن:

java.io.InputStream inputStream = ...
java.security.Key key = ...
javax.crypto.Cipher c =
javax.crypto.Cipher.getInstance("AES");
cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key);
javax.crypto.CipherInputStream decryptingInputStream =
new javax.crypto.CipherInputStream(inputStream, cipher);

و برای رمز نگاری جریان داده‌ی خروجی به نام outputStram اینطور:

java.io.OutputStream outputStream = ...
java.security.Key key = ...
javax.crypto.Cipher c =
javax.crypto.Cipher.getInstance("AES");
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key);
javax.crypto.CipherOutputStream encryptingOutputStream =
new javax.crypto.CipherOutputStream(outputStream, cipher);

و البته برای تولید کلیدی به نام key:

javax.crypto.KeyGenerator keygen =
javax.crypto.KeyGenerator.getInstance("AES");
java.security.SecureRandom random =
new java.security.SecureRandom();
keygen.init(random);
java.security.Key key = keygen.generateKey();





یه سوال از متخصصین برنامه نویس

15 04 2009

من تو قسمت امنیت چیچک به یه مشکل برخوردم که پرس و جو از دوستان و استاد ها برام نتیجه ای در بر نداشت. مساله اینه: چیچک یه فایل Properties داره که اطلاعاتی مثل نوع Look And Feel و وضعیت System Tray توی اون ذخیره می شه. از جمله چیز های دیگه که توی این فایل ذخیره می شه User name و Password وبسایت هایی مثل Twitter هستش که از نظر امنیتی این وضع خوبی نیست. من باید بتونم Password ها رو با یه الگوریتم بازگشت پذیر (دقت کنید که توابع Hash مثل MD5 به کار نمیاد) این ها رو کد کنم و در موقع نیاز اون ها رو بازیافت.

پیشاپیش بگم که RSA بهم جواب نمی ده یا حد اقل نمی تونم راهی به دست بیارم که با RSA این وضع رو کنترل کنم.
فراموش نکنید که چیچک یه برنامه ی Open Source هم هست و از هر الگوریتمی که استفاده کنم، به راحتی می شه الگوریتم رو خوند و پیدا کرد.

منتظر نظراتتون هستم.


بعد نوشت:

خب مساله رو می شه یکم تغییر داد به این صورت که من یه data دارم به اسم d و یه کلید عمومی دارم به pubKey و یه کلید اختصاصی دارم به نام privKey. خب d رو با pubKey کد می کنم (حالا با هر الگوریتمی) و d کد شده رو که اسمش cd هست رو یه جایی ذخیره می کنم. کنار cd هم می تونم برای کد کردن های بعد به راحتی pubKey رو ذخیره کنم. مشکل جدید این privKey هستش به این معنی که هر جایی که این رو ذخیره کنم، امنیت به خطر میفته و اگه این privKey رو نداشته باشم، از cd نمی تونم به d برسم. نمی تونم از حافظه ی کاربر برای نگه داری این privKey استفاده کنم چون:

  1. ممکنه این privKey مقدار خوش قلقی برای حفظ کردن نداشته باشه.
  2. کاربر ممکنه privKey رو فراموش کنه که در این صورت d هم از بین می ره.
  3. privKey رو الگوریتم به من می ده و نمی تونم خودم اون رو تولید کنم.

این ها برای الگوریتم های asymmetric بود ولی دقیقا همین مشکل رو برای الگوریتم های symmetric هم دارم.

نظر شما چیه؟


بعد نوشت:

الگوریتم AES (لینک تکمیلی) هم بررسی شد، جزو symmetric الگوریتم هاست و مشکل بالا همچنان برقراره.


راه حل:

بعضی از دوستان متن باز بودن رو مغایر با امن بودن دونستن. اما بالا خره من یه راه حل برای سوالم پیدا کردم. من الگوریتم AES رو پیاده می کنم و کلید رو توی خود سورس کد به صورت امن ذخیره می کنم. اینطور بعد از کامپایل کلید جای امنی خواهد داشت. اما چون اپن سورس هست پروژه، هرکسی که می خواد از سورس کامپایل کنه، می تونه کلید خودش رو توی سورس کد قرار بده. به همین راحتی!

به زودی این مشکل امنیتی چیچک رو برطرف می کنم.





انتشار چیچک

9 04 2009

بعد از مدت ها بالاخره سیستم میکرو بلاگینگ Identica رو به «چیچک» اضافه کردم و بالاخره نسخه ی اول قابل انتشار «چیچک» رو آماده کردم. می تونید «چیچک» رو دانلود کنید و البته فقط به صورت آزمایشی و برای پیدا کردن مشکلات اون این انتشار صورت می گیری.

برای اجرای «چیچک» نیاز به ماشین مجازی جاوا هست که یا از خود وب سایت جاوا اون رو دانلود کنید (که البته ایرانی ها نمی تونن این کار رو انجام بدن. من جدید ترین نسخه ی این برنامه رو برای ویندوز دانلود کردم و مجددا در یک فضای دیگه آپلود کردم تا بتونید به راحتی این برنامه رو نصب کنید.) یا از این فایل آپلود شده توسط من این برنامه رو برای ویندوز بگیرین. برای اوبونتو و ساید توزیع های گنو/لینوکس هم می تونید اون رو از مخازن موجود بدون هیچ دردسری نصب کنن.

کاربران ویندوز می تونن فایل اجرایی «چیچک» رو از این لینک بگیرن وکاربران سیستم عامل های دیگه (و البته ویندوز) فایل JAR «چیچک» (که قابل اجرا روی تمام سیستم عامل های پشتیبانی شده هست) رو از این لینک دانلود کنن.

منتظر نظراتتون برای بهبود «چیچک» هستم.





چیچک

5 04 2009
قابلیت های جدید چیچک
قابلیت های جدید چیچک

به پیشنهاد دوست عزیزم، حسن، قابلیت ارسال یادداشت ها به وب سایت Tumblr، رو به چیچک اضافه کردم. البته کتابخونه ی خوبی برای کار با این سایت پیدا نکردم و خودم دست به کار شدم و پایه ی پروژه ی JTumblr که یک کتابخونه ی کار با Tumblr رو با Java شروع کردم. البته فعلا به این کتابخونه قابلیت ارسال پست های معمولی رو اضافه کردم. در آینده تمام Tumblr API رو برای این کتابخونه پیاده خواهم کرد.

اما قسمت دیگه ی اضافه شده به چیچک، قابلیت به اشتراک گذاشتن یادداشت ها تو سایت FriendFeed هستش که با وجود کتابخونه های مختلف برای کار کردن با این سایت، ترجیح دادم برای سنگین نشدن پروژه با امکانات بلا استفاده، خودم به صورت دستی ارسال به FriendFeed رو پیاده کنم.

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

در اولین زمانی که به یک اینترنت پر سرعت دسترسی داشتم، سورس کد و کد قابل اجرای چیچک رو آپلود می کنم.
باز هم منتظر پیشنهاداتون هستم و هنوز منتظر همکارانی برای ادامه ی توسعه ی چیچک ام.

تصاویری از قابلیت های جدید چیچک ببینید:

فرندفید و چیچک

فرندفید و چیچک

تامبلر و چیچک

تامبلر و چیچک





چیچک

1 04 2009

در ادامه‌ی توسعه‌ی چیچک، قابلیت ارسال یاد داشت‌ها به وبلاگ‌های مبتنی بر وردپرس رو اضافه کردم. تصویر زیر رو ببینید:

وردپرس و چیچک

وردپرس و چیچک

باز هم منتظر نظرات و پیشنهادات شما هستم و بی صبراته در انتظار یه تیم توسعه‌ام.