وقتی پسوردها امن‌تر به اشتراک گذاشته می‌شوند!

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

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


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

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

سمت جاوااسکریپت تصمیم گرفته بودم از CryptoJS برای رمزنگاری/رمزگشایی استفاده کنم و سمت Golang هم باید دیتا به شکلی رمزنگاری میشد که با CryptoJS رمزگشایی بشه و برای این سازگاری مدتی زمان صرف کردم و بیشتر هم ریشه در ناآشنایی من با نحوه‌ی عملکرد CryptoJS داشت. به هر روی این کارها انجام شد و من هم اطلاعات خوبی در رابطه با رمزنگاری AES و کتابخونه CryptoJS یاد گرفتم.

 وب سایت پروژه
وب سایت پروژه




برای دیپلوی پروژه سرویس‌های PAAS ایرانی و خارجی را بررسی کردم و نسبت سخت افزار به هزینه‌ی پرداختی به نظرم متناسب نیومد در نتیجه تصمیم گرفتم با کمک Docker-compose و Traefik این مشکل را حل کنم. ورژن فعلی اپ به همین شکل دیپلوی شده. تمامی کدهای پروژه در گیتهاب به صورت اوپن سورس در دسترسه و با توجه به ماهیت ساختاری پروژه و اینکه تمام عملیات رمزنگاری و رمزگشایی در سمت کلاینت انجام میشه امکان خوندن نوت‌های امن به هیچ شکلی در سمت سرور فراهم نیست.


در نهایت هدف این پروژه برای من یه تمرین بود که به کمک میلاد ظاهر مناسبی براش طراحی شده و امیدوارم به دردتون بخوره. یه سری فیچر کوچک در آینده بهش اضافه میشه و بخشی از مشکلاتی که هنوز داره به مرور حل خواهد شد. اگر فکر میکنید بدون پیچیده شدن پروژه چیزهای به درد بخوری میشه بهش اضافه کرد لطفا تو گیتهاب ایشو باز کنید تا در موردش صحبت کنیم یا اگه فکر میکنید میتونید بخشی از پروژه را بهبود بدید یا جایی من اشتباه کردم و باید به شکل دیگه‌ای پیاده سازی انجام میشد لطفا با باز کردن ایشو یا PR به این پروژه کمک کنید.


پروژه در این آدرس و گیتهاب پروژه هم در این آدرس در دسترس قرار گرفته.

امیدوارم به دردتون بخوره...