Section 2/171 menit

2. Masalah yang Dipecahkan

2. Masalah yang Dipecahkan

Password: Lemah, Mudah Bocor, dan Susah Diingat

Autentikasi berbasis password memiliki fundamental flaws yang tidak bisa diselesaikan dengan UX yang lebih baik.

swift
// ❌ TANPA Passkeys: autentikasi password konvensional
class PasswordAuthManager {
    func login(username: String, password: String) async throws -> AuthToken {
        // Masalah 1: password dikirim ke server → bisa dicegat
        let hashedPassword = SHA256.hash(data: Data(password.utf8))

        // Masalah 2: server menyimpan hash → bisa di-crack jika breach
        let response = try await api.authenticate(
            username: username,
            passwordHash: hashedPassword.hexString
        )

        // Masalah 3: user menggunakan password yang sama di banyak service
        // → credential stuffing attack
        return response.token
    }
}

// Konsekuensi:
// - 81% data breach melibatkan password yang dicuri/lemah (Verizon DBIR)
// - Phishing mengekspos 1000an password per hari
// - Password reuse membuat satu breach merusak semua akun user
swift
// ✓ DENGAN Passkeys: tidak ada shared secret yang bisa dicuri
class PasskeyAuthManager {
    func authenticate(challenge: Data, relyingParty: String) async throws -> PasskeyAssertion {
        // Private key TIDAK PERNAH meninggalkan Secure Enclave
        // Server hanya menyimpan public key
        // Tidak ada yang bisa dicuri dari server side
        // Phishing tidak mungkin: credential bound ke domain
        let assertion = try await performPasskeyAssertion(
            challenge: challenge,
            relyingPartyID: relyingParty
        )
        return assertion  // hanya berisi signature, bukan secret
    }
}

Phishing yang Mustahil Dilawan dengan Password

swift
// ❌ TANPA Passkeys: user bisa tertipu login ke site palsu
// malicious-bank.com terlihat identik dengan real-bank.com
// User mengetik username + password → dicuri

// ✓ DENGAN Passkeys: credential origin-bound
// ASAuthorizationController menolak otomatis jika domain tidak cocok
// Passkey untuk bank.com TIDAK AKAN pernah bisa dipakai di malicious-bank.com
// Sistem OS yang enforce ini, bukan developer app

Multi-Factor Authentication yang Menyusahkan

swift
// ❌ TANPA Passkeys: 2FA via SMS atau TOTP — friction tinggi
func loginFlow() async {
    // Step 1: masukkan password
    // Step 2: tunggu SMS OTP (delay, bisa hilang)
    // Step 3: masukkan OTP dalam 30 detik
    // Step 4: jika expired, minta OTP baru
    // → User drop-off rate tinggi di step 2-4
}

// ✓ DENGAN Passkeys: biometrik IS multi-factor authentication
func loginWithPasskey() async {
    // Satu gesture Face ID = 2FA:
    // Factor 1: Something you HAVE (perangkat dengan private key)
    // Factor 2: Something you ARE (biometrik)
    // Selesai dalam <1 detik, tidak ada OTP
}