فارسی · 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/ قالببندی شماره، نمایش ارقام، متن اشتراکگذاری
شمای 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/ قرار دارد. اگر میخواهید از این پروژه در کار تجاری خودتان استفاده کنید، لایسنس فونت را جداگانه بررسی کنید.
مصطفی افروزی
- وبسایت: afrouzi.ir
- گیتهاب: github.com/mostafaafrouzi
- لینکدین: linkedin.com/in/mostafaafrouzi
- برنامههای دیگر در بازار: cafebazaar.ir/developer/057657612999
Issue و Pull Request خوشآمد است. اگر بانکی جا افتاده یا BIN اشتباهی دیدید، data/bank/IranianBanks.kt را ویرایش کنید.
MIT، فایل LICENSE