📊 Security Comparison
| System | Combinations | Key Security |
| Google Auth (6-digit) |
10⁶ = 1M |
Static key forever |
| Google Auth (8-digit) |
10⁸ = 100M |
Static key forever |
| SafeWord (3 words + PIN) |
256³×100 = 1.67B |
Static key |
| FSOTP + SafeWord ⭐ |
1.67B per period |
Ratchet per 30s |
🔑 TOTP — How It Works
Standard TOTP (RFC 6238) — Facebook, Google, GitHub সব ব্যবহার করে:
Counter = floor(UnixTime / 30)
OTP = HMAC-SHA1(Secret, Counter) → 6 digits
ব্যবহার: যেকোনো সার্ভিসের 2FA-তে কাজ করে।
দুর্বলতা: Secret একবার চুরি হলে সব OTP কম্প্রোমাইজড।
🔤 SafeWord Mode — Word-Based OTP
SafeWord একই HMAC ব্যবহার করে কিন্তু 256-word dictionary থেকে কোড তৈরি করে:
HMAC-SHA256(Secret, Counter) → bytes
Word1 = DICT[byte₄], Word2 = DICT[byte₅], Word3 = DICT[byte₆]
PIN = byte₇ mod 100 → 2 digits
Result: "STORM·CIPHER·NOVA·47"
সুবিধা:
✓ Shoulder-surfing কঠিন — digits মনে রাখা সহজ কিন্তু শব্দ লুকানো সহজ
✓ OCR/screenshot attack resist — শব্দ recognize করা কঠিন
✓ মানুষ মুখে বলে verify করতে পারে
✓ 1,677,721,600 combinations = Google Auth-এর 1677 গুণ
🛡 FSOTP — Forward Secrecy
Initialization:
S₀ = 256-bit random secret (encrypted in vault)
R₀ = CSPRNG random (fresh each period)
C₀ = SHA-256(R₀) = commitment (pre-published)
OTP Generation (period t):
msg = R_t ∥ period_counter
OTP_t = HMAC-SHA256(S_t, msg) → 6 digits
SafeWord_t = 3 words + PIN from same HMAC
Key Ratchet (every 30 seconds):
S_{t+1} = SHA-256(S_t ∥ R_t) ← one-way!
R_{t+1} = new CSPRNG random ← server keeps secret
Forward Secrecy guarantee:
S_t চুরি হলেও → S_{t+1} জানতে R_t লাগবে
R_t period শেষে reveal হয় → কিন্তু R_{t+1} তখনও গোপন
∴ Future codes = গাণিতিকভাবে অসম্ভব! (2²⁵⁶ operations)
🔒 Vault Encryption
সব data সম্পূর্ণ locally encrypted:
Key = PBKDF2-SHA256(password, salt, 310,000 iterations)
Stored = AES-256-GCM(key, accounts_json)
✓ 310,000 iterations — brute force = impractical
✓ Random salt per vault — rainbow table useless
✓ GCM mode — tampering detected automatically
✓ Zero transmission — কোনো server নেই
✓ WebCrypto API — browser native, no libraries