ওপেন সোর্স · সম্পূর্ণ এনক্রিপ্টেড · কোনো ক্লাউড নেই
PlainApp নিরাপত্তা গভীর বিশ্লেষণ
PlainApp কীভাবে আপনার ডেটা স্থানীয় Wi-Fi-তে সুরক্ষিত রাখে — ওপেন-সোর্স কোড থেকে প্রমাণসহ।
Android 9.0+ · Google Play · F-Droid · GitHub
ডাউনলোডস্থানীয় নেটওয়ার্ক নিরাপত্তা কেন গুরুত্বপূর্ণ?
আপনি যখন কোনো অ্যাপ ব্যবহার করে PC ব্রাউজার থেকে আপনার Android ফোন পরিচালনা করেন, তখন আপনার SMS, ছবি, পরিচিতি এবং ফাইলগুলো আপনার Wi-Fi নেটওয়ার্কের মধ্য দিয়ে যায়। বেশিরভাগ অ্যাপ এই সবকিছু পড়ার যোগ্য সাধারণ টেক্সট হিসেবে পাঠায়। একই নেটওয়ার্কে থাকা যেকেউ তা দেখতে পারে।
আপনি হয়তো ভাবছেন: "এটা তো আমার বাড়ির Wi-Fi, কে আবার গোপনে দেখবে?" কিন্তু ভেবে দেখুন:
- পাবলিক Wi-Fi — ক্যাফে, বিমানবন্দর, হোটেল — কাছাকাছি যেকেউ ট্র্যাফিক ক্যাপচার করতে পারে
- শেয়ার করা নেটওয়ার্ক — রুমমেট, অতিথি, বা আপোসকৃত IoT ডিভাইস
- রাউটারের দুর্বলতা — পরিচিত exploit সহ পুরানো firmware
যদি কোনো অ্যাপ আপনার SMS মেসেজগুলো HTTP-র মাধ্যমে সাধারণ টেক্সট হিসেবে পাঠায়, তাহলে Wireshark-এর মতো বিনামূল্যের টুল দিয়ে যেকেউ সেগুলো পড়তে পারে। এটি তাত্ত্বিক নয় — এটি অত্যন্ত সহজ।
বেশিরভাগ ফোন-ব্যবস্থাপনা অ্যাপ ঠিক এটাই করে। তাদের web UI ব্যবহার করার সময় Chrome DevTools খুলুন (F12 → Network ট্যাব), এবং আপনি প্রতিটি API কল সাধারণ JSON-এ পড়তে পারবেন — SMS-এর বিষয়বস্তু, ফাইল পাথ, পরিচিতির নাম, সবকিছু।
PlainApp কীভাবে আলাদা
PlainApp একাধিক স্তরের এনক্রিপশন এবং authentication প্রয়োগ করে। এখানে সহজ ভাষায় প্রতিটি স্তর কী করে তা বর্ণনা করা হলো।
GraphQL API — শুধুমাত্র যা দরকার তাই চান
বেশিরভাগ অ্যাপ পুরানো ধাঁচের REST API ব্যবহার করে: প্রতিটি রিসোর্সের জন্য একটি URL, আপনার প্রয়োজন হোক বা না হোক সবকিছু ফেরত দেয়। PlainApp GraphQL ব্যবহার করে — একটি আধুনিক পদ্ধতি যেখানে ব্রাউজার ঠিক যতটুকু ডেটা দরকার ততটুকুই চায়, এর বেশি নয়।
এটি কেন গুরুত্বপূর্ণ:
- কম ডেটা উন্মুক্ত — আপনার যদি শুধু ফাইলের নাম দরকার হয়, শুধু সেটাই পাঠানো হয়
- একটি মাত্র endpoint — ডজন ডজনের বদলে একটি মাত্র /graphql URL আছে, যা attack surface কমায়
- প্রতিটি query-তে আলাদা অনুমতি — প্রতিটি query তার নিজস্ব অনুমতি যাচাই করে (যেমন, লগইন করার পরেও SMS পড়তে READ_SMS অনুমতি প্রয়োজন)
এনক্রিপ্টেড API কল (XChaCha20-Poly1305)
এটিই PlainApp এবং বেশিরভাগ প্রতিযোগীদের মধ্যে সবচেয়ে বড় পার্থক্য।
প্রতিটি API অনুরোধ এবং প্রতিক্রিয়া — HTTP এবং WebSocket ট্র্যাফিক উভয়ই — XChaCha20-Poly1305 দিয়ে এনক্রিপ্ট করা হয়, HTTP এবং HTTPS উভয় মোডে। এটি WireGuard VPN, Cloudflare এবং Google-এর Tink লাইব্রেরি দ্বারা ব্যবহৃত একটি আধুনিক AEAD এনক্রিপশন অ্যালগরিদম।
সহজ ভাষায়:
- 1আপনার ব্রাউজার একটি অনুরোধ তৈরি করে (যেমন, "আমার SMS দেখাও")
- 2রিপ্লে সুরক্ষার জন্য একটি টাইমস্ট্যাম্প এবং র্যান্ডম nonce যোগ করে
- 3XChaCha20-Poly1305 দিয়ে পুরো payload কে অপাঠযোগ্য বাইনারি ডেটায় এনক্রিপ্ট করে
- 4এনক্রিপ্ট করা বাইনারি নেটওয়ার্কে পাঠানো হয় — কোনো base64 নেই, JSON নেই, বিশুদ্ধ বাইনারি
- 5শুধুমাত্র আপনার ফোনই ডিক্রিপ্ট এবং যাচাই করতে পারে
কেউ যদি ট্র্যাফিক ইন্টারসেপ্টও করে, তারা অর্থহীন binary ডেটা দেখবে — পড়ার যোগ্য JSON নয়।
এনক্রিপশন সম্পর্কে:
- 256-bit key (অত্যন্ত শক্তিশালী)
- 192-bit nonce (অন্যান্য cipher-কে প্রভাবিত করে এমন কিছু ধরনের আক্রমণ প্রতিরোধ করে)
- built-in tamper detection — কেউ যদি ট্রানজিটে ডেটা পরিবর্তন করে, decryption ব্যর্থ হয়
- Android পক্ষে: Google Tink দ্বারা চালিত
- Web পক্ষে: @noble/ciphers দ্বারা চালিত (একটি ভালোভাবে audit করা JavaScript crypto লাইব্রেরি)
ডিজিটাল স্বাক্ষর (Ed25519) — ডিভাইস-টু-ডিভাইস
দুটি PlainApp ডিভাইস যখন একে অপরের সাথে যোগাযোগ করে (যেমন, ফোন-টু-ফোন চ্যাট), শুধু এনক্রিপশনই যথেষ্ট নয় — প্রতিটি ডিভাইসকে যাচাই করতে হবে যে মেসেজটি সত্যিই অন্য ডিভাইস থেকে এসেছে এবং জালিয়াতি হয়নি।
টাইমস্ট্যাম্প
গ্রহণকারী ডিভাইস প্রেরকের পাবলিক key দিয়ে স্বাক্ষর যাচাই করে এবং 5 মিনিটের বেশি পুরানো টাইমস্ট্যাম্পের অনুরোধ প্রত্যাখ্যান করে। এটি জালিয়াতি এবং রিপ্লে আক্রমণ উভয়ই প্রতিরোধ করে।
নিরাপদ ডিভাইস পেয়ারিং (ECDH Key Exchange)
যখন দুটি PlainApp ডিভাইস একে অপরের সাথে পেয়ার করে (যেমন, দুটি ফোন), তাদের একটি শেয়ার করা encryption key দরকার। কিন্তু নেটওয়ার্কের মাধ্যমে key পাঠালে এর উদ্দেশ্যই ব্যর্থ হয়ে যাবে।
PlainApp এটি ECDH (Elliptic Curve Diffie-Hellman) key exchange দিয়ে সমাধান করে — একই গণিত যা TLS, Apple-এর Secure Enclave, এবং WebAuthn-এ ব্যবহৃত হয়:
- 1প্রতিটি ডিভাইস একটি key pair তৈরি করে (public + private)
- 2তারা শুধুমাত্র তাদের public key বিনিময় করে
- 3প্রতিটি ডিভাইস নিজের private key অন্যটির public key-এর সাথে সংযুক্ত করে
- 4উভয়ই একই shared secret-এ পৌঁছায় — এটি কখনো নেটওয়ার্কের মধ্য দিয়ে যায় না
এনক্রিপ্টেড URL — ফাইল পাথ লুকানো
এখানে একটি বিষয় যা বেশিরভাগ মানুষ লক্ষ্য করেন না: URL পাথও তথ্য প্রকাশ করে।
আপনি যখন কোনো ফাইল ডাউনলোড করেন, URL সার্ভারকে বলে আপনি কোন ফাইলটি চান। অনেক অ্যাপে URL দেখতে এরকম হয়:
/fs?path=/sdcard/DCIM/Camera/photo_2024.jpgট্র্যাফিক স্নিফ করা যেকেউ (বা ব্রাউজারের ইতিহাস দেখে) ঠিক জানতে পারবে আপনি কোন ফাইল অ্যাক্সেস করেছেন এবং আপনার ফোনের ফোল্ডার কাঠামো কী।
PlainApp URL-এ ফাইল পাথ এনক্রিপ্ট করে:
/fs?id=AxK9f2mQ7vR3xP8nWz...id প্যারামিটারটি হলো URL Token নামক একটি random key দিয়ে XChaCha20-Poly1305 ব্যবহার করে এনক্রিপ্ট করা ফাইল পাথ। ডিফল্টভাবে এই key স্থায়ী এবং অ্যাপ রিস্টার্ট করলেও পরিবর্তন হয় না, তাই শেয়ার করা লিংকগুলো কাজ করতে থাকে। key ছাড়া কেউ আসল পাথ অনুমান করতে পারে না, আপনার ফাইলগুলো তালিকাভুক্ত করতে পারে না, বা ডাউনলোড URL তৈরি করতে পারে না।
Self-Signed Certificate সহ HTTPS
PlainApp আপনার ফোনে একটি self-signed TLS certificate তৈরি করে। এটি একটি এনক্রিপ্টেড HTTPS টানেল তৈরি করে — একই প্রযুক্তি যা ব্যাংক এবং ওয়েবসাইটগুলো ব্যবহার করে।
Certificate যা ব্যবহার করে:
- ECDSA with P-256 curve (প্রধান ওয়েবসাইটগুলোর মতোই)
- SHA256 signature
- অ্যাপের private ডিরেক্টরিতে সংরক্ষিত
application-layer XChaCha20 এনক্রিপশনের সাথে মিলিয়ে, এটি আপনাকে দুটি স্বাধীন এনক্রিপশন স্তর দেয়। একটি ভেঙে ফেললেও অন্যটি না ভাঙা পর্যন্ত কোনো সাহায্য হবে না।
লগইন সুরক্ষা
PlainApp পাসওয়ার্ড অনুমান প্রতিরোধ করতে লগইন প্রচেষ্টা সীমিত করে:
- প্রতি IP ঠিকানায় প্রতি ৬০ সেকেন্ডে ৫টি প্রচেষ্টা
- এর পরে, সংযোগ প্রত্যাখ্যান করা হয়
- পুরানো rate-limit রেকর্ডগুলো স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যায়
HTTP বনাম HTTPS: একটি সৎ মূল্যায়ন
PlainApp HTTP এবং HTTPS উভয় মোড প্রদান করে। এখানে সৎ পার্থক্যটি বলা হলো:
| HTTP মোড | HTTPS মোড | |
|---|---|---|
| ফাইল পাথ URL | এনক্রিপ্টেড (XChaCha20) | এনক্রিপ্টেড (XChaCha20) |
| API কল | এনক্রিপ্টেড (XChaCha20) | এনক্রিপ্টেড (XChaCha20 + TLS) |
| ফাইল ডাউনলোড | ট্রানজিটে এনক্রিপ্ট করা নয় | TLS দ্বারা এনক্রিপ্টেড |
| কাদের জন্য | শুরু করা ব্যবহারকারীদের জন্য (কোনো ব্রাউজার SSL সতর্কতা নেই) | গোপনীয়তা-সচেতন ব্যবহারকারীদের জন্য |
উভয় মোডই XChaCha20-Poly1305 দিয়ে API কল এনক্রিপ্ট করে — আপনার SMS, পরিচিতি, এবং অন্যান্য ডেটা HTTP বা HTTPS যাই হোক সর্বদা এনক্রিপ্টেড থাকে।
HTTP মোড আছে কারণ self-signed certificate ব্রাউজারে একটি সতর্কতা দেখায় ("আপনার সংযোগ ব্যক্তিগত নয়")। কম প্রযুক্তিগত জ্ঞানসম্পন্ন ব্যবহারকারীদের জন্য এই সতর্কতা বিভ্রান্তিকর এবং ভয়ঙ্কর। HTTP এই ঝামেলা এড়ায়।
তবে, HTTP মোড ফাইল স্থানান্তর এনক্রিপ্ট করে না। আপনি যদি শেয়ার করা বা পাবলিক নেটওয়ার্কে থাকেন, সর্বদা HTTPS ব্যবহার করুন।
পরামর্শ: যখনই সম্ভব HTTPS ব্যবহার করুন। ব্রাউজারের self-signed certificate সতর্কতা গ্রহণ করুন — স্থানীয় নেটওয়ার্ক অ্যাপের জন্য এটি স্বাভাবিক এবং প্রত্যাশিত।
Supply Chain নিরাপত্তা — কম ডিপেন্ডেন্সি, কম ঝুঁকি
একটি নিরাপত্তা হুমকি যা অনেক ব্যবহারকারী ভাবেন না: supply chain attack। যখন কোনো অ্যাপ শত শত third-party লাইব্রেরি ব্যবহার করে, তার যেকোনো একটি আপোস হতে পারে — ক্ষতিকর কোড ইনজেক্ট করে ডেটা চুরি, cryptocurrency mining, বা backdoor খোলা হতে পারে।
JavaScript ইকোসিস্টেমে এটি বিশেষভাবে বিপজ্জনক। সাম্প্রতিক বছরগুলোতে, event-stream, ua-parser-js, এবং colors-এর মতো জনপ্রিয় npm package হাইজ্যাক করে লক্ষ লক্ষ প্রজেক্টে ক্ষতিকর কোড ইনজেক্ট করা হয়েছে। যদি কোনো ফোন ম্যানেজমেন্ট অ্যাপের web UI শত শত JS package টানে, প্রতিটিই একটি সম্ভাব্য attack vector।
PlainApp একটি সুচিন্তিত পদ্ধতি অনুসরণ করে: যতটা সম্ভব কম dependency ব্যবহার করা, এবং যখন অর্থবহ তখন কাস্টম কোড লেখা।
Android অ্যাপ (plain-app)
- কোনো dependency injection framework নেই (কোনো Hilt নেই, কোনো Dagger নেই) — সাধারণ singleton ব্যবহার করে
- Crypto পরিচালনা করে মাত্র ৩টি সুপরিচিত লাইব্রেরি: Google Tink, Bouncy Castle, এবং built-in Java Cryptography Extension
- সার্ভার চলে Ktor-এ (JetBrains-এর অফিসিয়াল Kotlin ফ্রেমওয়ার্ক) — কোনো অস্পষ্ট থার্ড-পার্টি সার্ভার লাইব্রেরি নেই
Web UI (plain-desktop)
মাত্র ৩৪টি runtime dependency — সাধারণ web অ্যাপের তুলনায় অনেক কম। সাধারণত npm package প্রয়োজন হয় এমন বেশ কিছু জিনিস শুরু থেকে তৈরি করা হয়েছে:
| বৈশিষ্ট্য | সাধারণ অ্যাপ | PlainApp |
|---|---|---|
| নোটিফিকেশন শব্দ | howler.js / tone.js | কাস্টম Web Audio API synth |
| UUID তৈরি | uuid npm package | হাতে লেখা RFC 4122 বাস্তবায়ন |
| ফাইল আপলোড | uppy / axios | কাস্টম chunked upload with queue |
| WebRTC ভিডিও | Twilio / Daily.co SDK | হাতে লেখা PeerConnection কোড |
| HTTP client | axios / ky | নেটিভ ব্রাউজার fetch |
Web পক্ষে Crypto ব্যবহার করে @noble/ciphers — একটি ভালোভাবে audit করা, zero-dependency JavaScript crypto লাইব্রেরি — বড়, ভারী বিকল্পগুলো টানার বদলে।
এটি কেন গুরুত্বপূর্ণ
আপনি যোগ করা প্রতিটি dependency এমন কোড যা আপনি নিয়ন্ত্রণ করেন না। PlainApp-এর পদ্ধতির অর্থ:
- ক্ষতিকর কোড লুকানোর জায়গা কম
- ছোট attack surface
- audit করা সহজ (সম্পূর্ণ কোডবেস ওপেন সোর্স)
- পরিত্যক্ত বা হাইজ্যাক হওয়া npm package থেকে কোনো ঝুঁকি নেই
অনেক প্রতিযোগী কোথায় ভুল করে
এটি নির্দিষ্ট অ্যাপের নাম বলার বিষয় নয়। এটি এই ক্যাটাগরি জুড়ে সাধারণ প্যাটার্ন সম্পর্কে:
| নিরাপত্তা দিক | PlainApp | প্রতিযোগীদের মধ্যে সাধারণ |
|---|---|---|
| API ট্র্যাফিক | এনক্রিপ্টেড (XChaCha20) HTTP এবং HTTPS উভয়তেই | HTTP-র মাধ্যমে সাধারণ JSON |
| WebSocket ট্র্যাফিক | এনক্রিপ্ট করা বাইনারি ফ্রেম (XChaCha20) | সাধারণ টেক্সট JSON বা WebSocket নেই |
| অথেন্টিকেশন টোকেন হ্যান্ডলিং | এনক্রিপশন key হিসেবে ব্যবহৃত, হেডারে কখনো নয় | HTTP হেডারে পাঠানো হয় (সহজেই ফাঁস হয়) |
| ফাইল URL | এনক্রিপ্টেড path ID | সাধারণ টেক্সট পাথ উন্মুক্ত |
| Key exchange | ECDH (P-256) | নেই |
| অনুরোধ স্বাক্ষর | Ed25519 (শুধুমাত্র ডিভাইস-টু-ডিভাইস) | নেই |
| রিপ্লে সুরক্ষা | 30 সেকেন্ড + nonce (Web); 5 মিনিট + স্বাক্ষর (ডিভাইস) | নেই |
| লগইন সুরক্ষা | রেট লিমিটিং + দ্বি-ফ্যাক্টর নিশ্চিতকরণ | সীমাহীন প্রচেষ্টা |
| ডেটা রাউটিং | ১০০% স্থানীয়, কোনো cloud নেই | কিছু cloud-এর মাধ্যমে রাউট করে |
| ডিপেন্ডেন্সি | ন্যূনতম, সুপরিচিত লাইব্রেরি | শত শত npm package |
| সোর্স কোড | ওপেন সোর্স (GPL-3.0) | বেশিরভাগ বন্ধ উৎস |
যেকোনো অ্যাপ পরীক্ষা করার সবচেয়ে সহজ উপায়: অ্যাপ ব্যবহার করার সময় Chrome DevTools খুলুন (F12) → Network ট্যাব। আপনি যদি API response JSON হিসেবে পড়তে পারেন, তাহলে অ্যাপটিতে কোনো এনক্রিপশন নেই।
নিজে যাচাই করুন
PlainApp সম্পূর্ণ ওপেন সোর্স। এই নিবন্ধের প্রতিটি দাবি কোডে যাচাই করা যায়।
github.com/plainhub/plain-app (GPL-3.0)স্বয়ংক্রিয়, ট্রেসযোগ্য এবং ট্যাম্পার-প্রতিরোধী রিলিজ পাইপলাইন
সব ইনস্টল প্যাকেজ GitHub ও F-Droid অবকাঠামো দিয়ে স্বয়ংক্রিয়ভাবে তৈরি হয়। বিল্ডগুলো ট্রেসযোগ্য, নিরাপদ এবং ম্যানুয়াল হস্তক্ষেপের চিহ্নমুক্ত। PlainApp খুব কম Android অ্যাপের একটি যা যাচাইযোগ্য বিল্ড (SLSA) এবং VirusTotal-স্ক্যানড রিলিজ একসাথে দেয়।
GitHub এবং F-Droid-এ স্বয়ংক্রিয় বিল্ড
রিলিজ আর্টিফ্যাক্ট স্থানীয়ভাবে ম্যানুয়াল প্যাকেজিং নয়, CI পাইপলাইনে তৈরি হয়। প্রতিটি আর্টিফ্যাক্ট সোর্স কমিট ও রিপ্রোডিউসিবল বিল্ড ওয়ার্কফ্লো পর্যন্ত ট্রেস করা যায়।
SLSA Provenance (Level 3) + VirusTotal স্ক্যান
প্রতিটি রিলিজে SLSA provenance attestation ও VirusTotal স্ক্যান ফলাফল থাকে, ফলে সাপ্লাই চেইন অডিটযোগ্য হয় এবং ইনস্টলেশনের আগে ব্যবহারকারীরা অখণ্ডতা যাচাই করতে পারেন।
প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
HTTP মোড ব্যবহার করলেও কি PlainApp সত্যিই এনক্রিপ্টেড?
হ্যাঁ। সমস্ত API কল (SMS, পরিচিতি, ফাইল তালিকা, ইত্যাদি) HTTP এবং HTTPS উভয় মোডেই XChaCha20-Poly1305 দিয়ে এনক্রিপ্ট করা হয়। HTTP মোডে শুধুমাত্র ফাইল ডাউনলোড এনক্রিপ্ট করা হয় না। সম্পূর্ণ সুরক্ষার জন্য HTTPS ব্যবহার করুন।
আমার ব্রাউজার কেন নিরাপত্তা সতর্কতা দেখায়?
PlainApp এনক্রিপশনের জন্য একটি self-signed TLS certificate ব্যবহার করে। যেহেতু এটি কোনো পাবলিক Certificate Authority দ্বারা জারি করা হয়নি, আপনার ব্রাউজার একটি সতর্কতা দেখায়। স্থানীয় নেটওয়ার্ক অ্যাপের জন্য এটি স্বাভাবিক এবং প্রত্যাশিত। চালিয়ে যেতে 'Advanced' এবং 'Proceed'-এ ক্লিক করুন।
একই Wi-Fi-তে থাকা কেউ কি আমার ডেটা দেখতে পারে?
PlainApp-এর সাথে, না। API কল XChaCha20-Poly1305 দিয়ে এনক্রিপ্ট করা হয়, এবং HTTPS মোডে ফাইল স্থানান্তরও TLS দ্বারা এনক্রিপ্ট করা হয়। বেশিরভাগ প্রতিযোগী অ্যাপের সাথে, হ্যাঁ — তাদের API কল সাধারণ টেক্সট JSON হিসেবে পাঠানো হয়।
PlainApp কীভাবে VPN-এর সাথে তুলনা করে?
একটি VPN আপনার ডিভাইস এবং VPN সার্ভারের মধ্যে ট্র্যাফিক এনক্রিপ্ট করে। PlainApp স্থানীয় নেটওয়ার্কে আপনার ফোন এবং ব্রাউজারের মধ্যে ট্র্যাফিক এনক্রিপ্ট করে। তারা ভিন্ন উদ্দেশ্যে কাজ করে — PlainApp স্থানীয় ডিভাইস ব্যবস্থাপনা সুরক্ষিত করে, যেখানে VPN ইন্টারনেট ট্র্যাফিক সুরক্ষিত করে।
কোডটি কি সত্যিই ওপেন সোর্স?
হ্যাঁ। PlainApp GPL-3.0 লাইসেন্সের অধীনে আছে। সম্পূর্ণ সোর্স কোড github.com/plainhub/plain-app-এ পাওয়া যায়। আপনি প্রতিটি encryption বাস্তবায়ন পরীক্ষা করতে পারেন, সোর্স থেকে বিল্ড করতে পারেন, বা অবদান রাখতে পারেন।
আপনার ফোনের নিয়ন্ত্রণ ফিরিয়ে নিন।
কোন ক্লাউড মিডলম্যান নেই। কোন মাসিক ফি নেই। শুধু আপনার ফোন এবং আপনার ব্রাউজার.