Skip to content

Repository files navigation

کارت من

فارسی · English

اپلیکیشن اندروید برای نگه‌داری شماره کارت، شبا و شماره حساب، کاملاً روی همین گوشی و بدون هیچ ارتباطی با اینترنت.

هر بار که کسی شماره کارتتان را می‌خواهد یا لازم است شبای یک حساب را پیدا کنید، باید بین پیام‌ها و یادداشت‌ها بگردید. «کارت من» همهٔ این اطلاعات را یک‌جا و رمزنگاری‌شده روی گوشی خودتان نگه می‌دارد. با یک لمس کپی می‌شوند و با یک دکمه فرستاده می‌شوند.

نسخهٔ ۱.۰.۰ · اندروید ۸ (API 26) و بالاتر · MIT


چه کاری انجام می‌دهد

کارت‌ها در دو بخش جدا

کارت‌های من جایی است که کارت‌های خودتان را با همهٔ جزئیات، از جمله CVV2 و تاریخ انقضا، ذخیره می‌کنید. کارت‌های دیگران برای شماره‌هایی است که فقط برای واریز به آن‌ها نیاز دارید؛ در این بخش خبری از CVV2 و انقضا نیست، چون لازم نیست.

بانک را خودش تشخیص می‌دهد

شش رقم اول کارت را که وارد کنید، بانک شناسایی می‌شود و لوگو و رنگ همان بانک روی کارت می‌آید. اگر کارت شناخته نشد، بانک را از فهرست انتخاب کنید.

در حال حاضر ۴۵ بانک، مؤسسهٔ اعتباری و نئوبانک ایرانی در فهرست هستند که برای ۳۹ موردشان تشخیص خودکار از روی BIN انجام می‌شود. نئوبانک‌ها (بلوبانک، ویپاد، های‌بانک، بانکینو، بانکت، متابانک، دیجی‌پی) زیر نام بانک مادرشان نشان داده می‌شوند.

کپی و اشتراک‌گذاری

روی هر مقداری بزنید تا کپی شود: شماره کارت، شبا، شماره حساب، CVV2. آنچه در کلیپ‌بورد می‌رود همیشه رقم استاندارد انگلیسی و بدون فاصله و خط تیره است، تا در هر برنامه‌ای درست جای‌گذاری شود. روی اندروید ۱۳ و بالاتر، محتوای کپی‌شده به‌عنوان «حساس» علامت می‌خورد تا در نوار پیش‌نمایش کلیپ‌بورد نمایش داده نشود.

دکمهٔ اشتراک‌گذاری، اطلاعات کارت را در قالب یک متن مرتب به واتساپ، تلگرام یا هر برنامهٔ دیگری می‌فرستد. CVV2 و تاریخ انقضا هیچ‌وقت در متن اشتراک‌گذاری نمی‌آیند.

CVV2 هم به‌طور پیش‌فرض پوشانده شده است. با زدن روی آیکون چشم نمایش داده می‌شود و بار بعد که بزنید، کپی می‌شود و دوباره پنهان می‌شود.

پیدا کردن و چیدن

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

امنیت

  • ورود با پین (۴ تا ۸ رقم) و اثر انگشت
  • برنامه به محض رفتن به پس‌زمینه قفل می‌شود
  • گرفتن اسکرین‌شات و نمایش محتوا در فهرست برنامه‌های اخیر مسدود است (FLAG_SECURE)
  • پایگاه‌دادهٔ برنامه با SQLCipher رمزنگاری شده و کلیدش در ناحیهٔ امن دستگاه نگه‌داری می‌شود (EncryptedSharedPreferences روی Android Keystore)
  • پین با PBKDF2 و نمک تصادفی هش می‌شود و خودِ پین هیچ‌جا ذخیره نمی‌شود

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

پشتیبان‌گیری

از تنظیمات می‌توانید یک فایل .mycard بگیرید که همهٔ کارت‌ها و تنظیمات ظاهری را در خود دارد. فایل با AES-256-GCM رمزنگاری می‌شود و کلید با PBKDF2 و ۱۲۰٬۰۰۰ تکرار از رمز شما ساخته می‌شود.

گذاشتن رمز اجباری است و حداقل ۶ نویسه لازم دارد. چون فایل پشتیبان شماره کارت و CVV2 دارد، اجازه نمی‌دهیم بدون رمز ساخته شود؛ در غیر این صورت کلید باید یک مقدار ثابت داخل خود برنامه می‌بود و هر کسی که برنامه را دارد می‌توانست فایل را باز کند.

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

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

ظاهر

  • تم روشن، تاریک یا مطابق دستگاه
  • انتخاب بین فونت ایران‌یکان X و ایران‌سنس X
  • اعداد رابط کاربری و اعداد شماره کارت را جدا از هم می‌توانید فارسی یا انگلیسی کنید (پیش‌فرض: رابط کاربری فارسی، شماره کارت انگلیسی). این تنظیم فقط ظاهر را عوض می‌کند و داده‌ای که ذخیره، کپی و اشتراک‌گذاری می‌شود همیشه رقم انگلیسی است.

قابلیت‌های آزمایشی

این‌ها در تنظیمات، بخش «آزمایشی» هستند:

قابلیت کار پیش‌فرض
یادآوری انقضای کارت اعلان محلی برای کارت‌هایی که تا یک ماه آینده منقضی می‌شوند خاموش
گروه‌بندی بر اساس بانک کارت‌ها زیر نام بانک دسته می‌شوند و می‌توانید یک بانک را فیلتر کنید خاموش
لیست فشرده هر کارت در یک سطر خلاصه می‌شود و با لمس باز می‌شود خاموش
لرزش هنگام کپی بازخورد لمسی کوتاه بعد از کپی روشن

یادآوری انقضا کاملاً محلی است و با WorkManager روزی یک بار بررسی می‌کند. هیچ درخواستی به سرور فرستاده نمی‌شود.


حریم خصوصی

برنامه مجوز INTERNET ندارد. یعنی حتی اگر بخواهد هم نمی‌تواند چیزی بفرستد. این را می‌توانید در AndroidManifest.xml ببینید.

  • بدون تبلیغ، بدون آنالیتیکس، بدون SDK ردیابی
  • بکاپ ابری اندروید عمداً غیرفعال است (allowBackup="false") تا اطلاعات کارت‌ها روی سرور گوگل نرود
  • هیچ مجوز دسترسی به حافظه گرفته نمی‌شود و ذخیرهٔ فایل بکاپ از طریق انتخابگر فایل خودِ اندروید انجام می‌شود

مجوزهایی که گرفته می‌شود

مجوز برای چه چه زمانی
USE_BIOMETRIC ورود با اثر انگشت فقط اگر خودتان فعال کنید
VIBRATE لرزش کوتاه بعد از کپی اگر «لرزش هنگام کپی» روشن باشد
POST_NOTIFICATIONS اعلان یادآوری انقضا فقط اگر یادآوری را روشن کنید
RECEIVE_BOOT_COMPLETED زمان‌بندی دوبارهٔ یادآوری بعد از ریستارت گوشی فقط اگر یادآوری روشن باشد

دریافت برنامه

  • GitHub Releases: آخرین نسخه
  • کافه‌بازار: به‌زودی
  • Google Play: به‌زودی

تاریخچهٔ نسخه‌ها

۱.۰.۰

اولین انتشار عمومی. همهٔ چیزهایی که در بخش‌های بالا توضیح داده شد در همین نسخه هستند:

  • دو بخش جدا برای کارت‌های خودتان و کارت‌های دیگران
  • تشخیص خودکار بانک از روی BIN با لوگو و رنگ برند، برای ۴۵ بانک و نئوبانک
  • فرم شماره کارت با چهار خانهٔ جدا، شامل جابه‌جایی خودکار بین خانه‌ها، پشتیبانی از جای‌گذاری کل شماره و بک‌اسپیس بین خانه‌ها
  • کپی با یک لمس، اشتراک‌گذاری بدون CVV2 و انقضا، پوشاندن CVV2
  • جستجو در همهٔ فیلدها و چیدمان دستی با کشیدن
  • قفل با پین و اثر انگشت، قفل خودکار در پس‌زمینه، مسدود کردن اسکرین‌شات
  • پیشنهاد فعال کردن قفل بعد از اولین کارت، برای کاربرانی که سراغ تنظیمات نمی‌روند
  • پایگاه‌دادهٔ رمزنگاری‌شده با SQLCipher
  • بکاپ و بازگردانی با فایل .mycard و رمز اجباری
  • تم روشن، تاریک و سیستم، دو خانوادهٔ فونت، تنظیم جداگانهٔ ارقام فارسی و انگلیسی
  • چهار قابلیت آزمایشی: یادآوری انقضا، گروه‌بندی بانکی، لیست فشرده، لرزش کپی

برای توسعه‌دهندگان

فناوری‌ها

Kotlin · Jetpack Compose · Material 3 · Room + SQLCipher · DataStore · BiometricPrompt · WorkManager

Package com.afrouzi.mycard
minSdk / targetSdk / compileSdk 26 / 35 / 35
AGP / Kotlin 8.7.3 / 2.0.21
versionName / versionCode 1.0.0 / 1

ساختار پروژه

app/src/main/java/com/afrouzi/mycard/
├── data/
│   ├── bank/          فهرست بانک‌ها و تشخیص BIN
│   ├── backup/        ساخت و خواندن فایل .mycard
│   ├── db/            Room و راه‌اندازی SQLCipher
│   ├── model/         موجودیت BankCard
│   └── prefs/         تنظیمات روی DataStore
├── reminders/         یادآوری انقضا با WorkManager
├── security/          هش پین و کلید پایگاه‌داده
├── ui/                صفحه‌ها و کامپوننت‌های Compose
└── util/              قالب‌بندی شماره، نمایش ارقام، متن اشتراک‌گذاری

پایگاه‌داده و migration

شمای Room در app/schemas/ اکسپورت و کامیت می‌شود و هیچ fallbackToDestructiveMigration در کد نیست. یعنی اگر نسخهٔ دیتابیس بالا برود و migration نوشته نشده باشد، برنامه موقع باز کردن دیتابیس عمداً خطا می‌دهد، به‌جای اینکه بی‌سروصدا کارت‌های کاربر را پاک کند. هر بار که موجودیت BankCard را تغییر دادید، version را زیاد کنید و migration جدید را به ALL_MIGRATIONS در AppDatabase.kt اضافه کنید.

ساخت

git clone https://github.com/mostafaafrouzi/MyCard.git
cd MyCard
./gradlew assembleDebug

برای ساخت نسخهٔ امضاشده به‌صورت محلی، فایل keystore.properties را در ریشهٔ پروژه بسازید. این فایل در .gitignore است و نباید کامیت شود:

storeFile=keystore/mycard-release.jks
storePassword=...
keyAlias=...
keyPassword=...

بعد:

./gradlew assembleRelease bundleRelease

خروجی APK برای نصب مستقیم و کافه‌بازار است و AAB برای Google Play Console. اگر keystore.properties وجود نداشته باشد، بیلد release بدون امضا ساخته می‌شود.

انتشار خودکار

ورک‌فلو .github/workflows/release.yml با پوش شدن تگی به شکل v* اجرا می‌شود، APK و AAB را با کلید پروژه امضا می‌کند، امضا را با apksigner و jarsigner بررسی می‌کند و ریلیز GitHub را می‌سازد. متن ریلیز از .github/release-notes.md خوانده می‌شود.

Secrets لازم در تنظیمات ریپازیتوری:

Secret محتوا
KEYSTORE_BASE64 فایل .jks به‌صورت base64
KEYSTORE_PASSWORD رمز keystore
KEY_ALIAS نام کلید
KEY_PASSWORD رمز کلید
git tag -a v1.0.0 -m "Release 1.0.0"
git push origin v1.0.0

کلید امضا در مخزن نیست و نباید باشد. از فایل .jks و رمزهایش بکاپ امن بگیرید، چون اگر گم شوند دیگر نمی‌توانید برای همین اپلیکیشن بروزرسانی منتشر کنید.

فونت

برنامه از خانواده‌های ایران‌یکان X و ایران‌سنس X استفاده می‌کند. متن لایسنس در app/src/main/assets/fontiran/ قرار دارد. اگر می‌خواهید از این پروژه در کار تجاری خودتان استفاده کنید، لایسنس فونت را جداگانه بررسی کنید.


توسعه‌دهنده

مصطفی افروزی

مشارکت

Issue و Pull Request خوش‌آمد است. اگر بانکی جا افتاده یا BIN اشتباهی دیدید، data/bank/IranianBanks.kt را ویرایش کنید.

مجوز

MIT، فایل LICENSE

About

Android app for managing Iranian bank cards — fully offline, no ads, no tracking. PIN/biometric lock, encrypted backup, Jetpack Compose.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages