# 2026 數位防禦實踐：Passkey 完全取代密碼的技術指南

## 為什麼密碼已死

2025 年全球資料洩漏報告：**81% 的入侵事件**與密碼相關問題有關：

- 🔓 弱密碼或跨站重複使用
- 🎣 釣魚攻擊 (Phishing)
- 🗄️ 憑證填充攻擊 (Credential Stuffing)

Passkey 從根本上讓這些攻擊**在技術層面徹底失效**。

---

## Passkey 技術原理

基於 **FIDO2 / WebAuthn** 標準，核心是非對稱加密：

```
[Registration Flow]

User Device                    Server
    |                             |
    |  1. 生成金鑰對               |
    |     私鑰 → 留在設備 (TEE)    |
    |     公鑰 ──────────────── → | 儲存公鑰
    |                             |

[Authentication Flow]

User Device                    Server
    |                             |
    |  ← ── Challenge（隨機值）─── |
    |                             |
    |  生物識別解鎖私鑰             |
    |  對 Challenge 簽名 ──────→  | 用公鑰驗證
    |                             | ✓ 認證成功
```

**關鍵安全屬性：**
- 私鑰永不離開設備（TPM / Secure Enclave / TEE）
- Challenge 綁定 Origin：釣魚網站無法重用簽名
- 無密碼 = 無密碼洩漏風險

---

## Node.js 實作範例

```javascript
import {
  generateRegistrationOptions,
  verifyRegistrationResponse,
} from '@simplewebauthn/server';

const RP_ID = 'blog.idri.ai';
const ORIGIN = 'https://blog.idri.ai';

export async function generatePasskeyRegistration(userId, username) {
  const options = await generateRegistrationOptions({
    rpName: 'IDRI BLOG',
    rpID: RP_ID,
    userID: Buffer.from(userId),
    userName: username,
    attestationType: 'none',
    authenticatorSelection: {
      residentKey: 'required',       // Discoverable Credential
      userVerification: 'required',  // 強制生物識別
    },
    supportedAlgorithmIDs: [-7, -257], // ES256, RS256
  });
  
  session.challenge = options.challenge;
  return options;
}
```

---

## 2026 平台支援現況

| 平台 | 支援狀態 |
|---|---|
| Chrome / Edge 108+ | ✅ 完整支援 |
| Safari / iOS 16+ | ✅ 完整支援 |
| Firefox 122+ | ✅ 完整支援 |
| Android（指紋/臉部） | ✅ 完整支援 |
| Windows Hello | ✅ 完整支援 |
| YubiKey 5 系列 | ✅ 硬體金鑰 |

---

## 遷移路徑

```
Phase 1 → 密碼 + Passkey 並存（使用者可選）
Phase 2 → Passkey 優先（密碼移至「其他方式」）
Phase 3 → 完全無密碼（新用戶無法設密碼）
```

---

**去密碼化的旅程從今天開始。** 作為資安研究員，推廣 Passkey 普及是目前最具實際效益的防禦工作之一。

*本文代碼可在 MIT 授權下自由使用。*
