RSA 金鑰產生器會在瀏覽器中全新產生一組 RSA-OAEP 金鑰對,模數長度為 2048 或 3072 位元、指數為 65537、並使用 SHA-256 填充,匯出為 SubjectPublicKeyInfo 與 PKCS#8 PEM 區塊,全程皆在您的瀏覽器中完成。針對 GitHub 相關工作,實務上要回答的問題是:您的使用者端究竟預期哪一種 RSA 格式。GitHub 的主要身分驗證路徑——透過 SSH 進行推送與拉取——使用的是 ssh-keygen 產生的 OpenSSH 格式金鑰,而非原始的 PEM。RSA 金鑰產生器鎖定的反而是 RSA-OAEP 加密工作流程:公開金鑰會散布到遠端系統,而 PKCS#8 私密金鑰則匯入受保護的金鑰儲存庫。實際案例包括:為 GitHub Actions 秘密加密一把對稱資料金鑰、保護傳送至發佈工作流程的構件,或是把金鑰素材餵給預期接收 SPKI 公開輸入的 CI 管線。所有金鑰的產生、匯出與匯入處理都透過 Web Crypto 在本機完成;位元組從未離開分頁,頁面也不會對所產生的金鑰素材發出任何網路請求。本文其餘部分會逐步說明:確認使用者端的需求、產生金鑰對、讀取 PEM 輸出,以及安全地儲存私密金鑰。

GitHub 的 RSA 金鑰:SSH 身分驗證 vs RSA-OAEP
GitHub 接受兩種主要的儲存庫存取憑證類型:OpenSSH 格式的 SSH 金鑰(通常為 Ed25519 或 RSA),以及透過 HTTPS 使用的個人存取權杖。OpenSSH 格式是單行內容,以 ssh-rsa 或 ssh-ed25519 開頭,由 ssh-keygen 或 PuTTYgen 之類的工具所產生。RSA 金鑰產生器並不會產生 OpenSSH 金鑰;若把 SPKI PEM 區塊貼到 GitHub 的「Add SSH key」表單中,將會被網頁介面拒絕。
此處產生的 RSA-OAEP PEM 金鑰對則扮演不同的角色。當應用程式、腳本或 GitHub Actions 工作流程需要為持有者的公開金鑰加密資料,或是第三方服務預期接收 SPKI 或 PKCS#8 PEM 輸入時,它們就能派上用場。在產生之前,請先確認接收端所預期的精確演算法、填充、雜湊與信封格式。若使用者端的文件載明採用 RSA-OAEP 搭配 SHA-256,並使用上述兩種 PEM 類型之一,則本產生器即符合需求。如需用於儲存庫的 SSH 身分驗證,請改用專屬的工作流程,例如PEM 與 OpenSSH 的比較,或直接使用 ssh-keygen。
這項區分之所以重要,是因為 GitHub 的 SSH 表單會進行格式特定的剖析。OpenSSH 金鑰包含金鑰類型前綴、base64 編碼區塊,以及註解。SPKI PEM 則帶有 ASN.1 結構,以 -----BEGIN PUBLIC KEY----- 標記包覆,如 RFC 7468 所定義。這兩種編碼無法互換;成功將 PEM 匯入 Web Crypto 環境,並不代表同一個區塊會被接受為 SSH 憑證。
在瀏覽器中產生 RSA 金鑰對
- 確認使用者端預期接收 RSA-OAEP 搭配 SHA-256、指數 65537,以及 SPKI 公開 PEM 或 PKCS#8 私密 PEM。若使用者的系統預設為 SHA-1、PKCS#1 v1.5 填充或自訂指數,則此金鑰對將無法互通。
- 開啟RSA 金鑰產生器並選擇 2048 或 3072 位元。2048 位元模數的互通性廣泛,且產生速度較快;3072 位元則提供更大的安全邊際,代價是產生時間明顯拉長、操作變慢。
- 點擊「Generate」並等待 Web Crypto 作業完成。產生為非同步作業,任務識別碼可避免較舊的請求覆寫較新的設定。
- 將 -----BEGIN PUBLIC KEY----- 區塊複製到加密系統以便散布,並將 -----BEGIN PRIVATE KEY----- 區塊直接匯入受保護的金鑰儲存庫或秘密管理器。請勿將私密 PEM 貼到原始檔控制、即時通訊或筆記中。
- 在使用者端的完整協定下執行端對端加密測試,再依賴此金鑰對。成功匯入 Web Crypto 是必要條件,但並非充分條件;請驗證使用者端回報的模數長度是否正確,以及加密往返是否能逐位元組還原原始明文。
理解 SPKI 與 PKCS#8 PEM 輸出
產生完成後,工具會顯示兩個 PEM 區塊。公開金鑰使用 RFC 7468 中定義的 SubjectPublicKeyInfo 結構,以 -----BEGIN PUBLIC KEY----- 開頭,內容包含演算法識別碼,以及模數與公開指數。任何需要為持有者加密的系統皆可讀取此區塊。私密金鑰則使用未加密的 PKCS#8 信封,以 -----BEGIN PRIVATE KEY----- 開頭,內含完整的私密指數、質數,以及解密所需的 CRT 參數。RFC 8017 規定了底層的 RSA 基本運算。
| 欄位 | 公開金鑰 (SPKI) | 私密金鑰 (PKCS#8) |
|---|---|---|
| PEM 標頭 | -----BEGIN PUBLIC KEY----- | -----BEGIN PRIVATE KEY----- |
| ASN.1 結構 | SubjectPublicKeyInfo | PKCS#8 (未加密) |
| 內容 | 模數、公開指數 | 模數、私密指數、質數、CRT |
| 可自由散布? | 是 | 否 |
| 合適的儲存方式 | 純文字、儲存庫、文件 | 硬體金鑰儲存庫、秘密管理器、加密保存庫 |
| 編碼方式 | Base64 包覆 DER,每行 64 字元 | Base64 包覆 DER,每行 64 字元 |
| 可解密密文? | 否 | 是 |
公開指數固定為 65537 (0x010001),也就是幾乎所有 RSA 實作所預期的 F4 值。模數長度可由使用者選擇 2048 或 3072 位元。無法選擇不同的指數,也無法在私密金鑰輸出外包覆密語。由於 Web Crypto 在匯出 PKCS#8 時不加上加密信封,因此私密 PEM 必須直接移入金鑰儲存庫或秘密管理器,由其自行提供保護。
私密金鑰的安全儲存
私密 PEM 是唯一能解密傳送給持有者之密文的元件。任何取得它的人皆能還原對應的明文,因此一旦複製它,就等於移轉了對其保護的全部責任。本產生器並不會對輸出加上密碼加密,合約中也明確聲明私密輸出未受密碼保護。從它在畫面上出現的那一刻起,請將其視為高價值的秘密。
合適的存放位置包括:硬體安全模組、作業系統的金鑰儲存庫(例如 Windows Certificate Store 或 macOS Keychain)、雲端秘密管理器(GitHub Actions 加密秘密、AWS Secrets Manager、HashiCorp Vault),或是支援附件的加密密碼管理器。不適合的存放位置包括:原始檔控制、工單系統、即時通訊記錄、瀏覽器同步、分析儀表板,或一般筆記。將私密 PEM 匯入其目的地後,請關閉分頁、清除剪貼簿紀錄,並移除任何本機複本。
若私密金鑰在任何時間點外洩,請立即輪替:重新產生一組新金鑰對,並針對原本發送給舊公開金鑰的資料重新加密。請將舊的私密金鑰視為永久遭到破解;對於先前已用其公開對應金鑰加密的資料,並沒有任何事後重新保護的方法。以相同設定產生兩次必須產生不同的金鑰,因為安全的產生程序必須具備隨機性;切勿依賴任何可重現的特性。
RSA-OAEP 金鑰在 GitHub 工作流程中的適用時機
RSA-OAEP 是一種非對稱加密機制,而非簽章或身分驗證機制。與 GitHub 相關的實務使用情境包括:在將對稱資料金鑰存入 GitHub Actions 秘密前先加以包裝,使得只有私密金鑰的持有者能解開;加密下游 CI 工作流程將解密的發佈構件或備份;為預期接收標準 PEM 的第三方 API 或函式庫提供 SPKI 輸入;以及在服務啟動之初以 RSA-OAEP 密文交換資料,再切換至工作階段金鑰。上述各項皆需要使用者端在文件中明載 RSA-OAEP 搭配 SHA-256,以及 SPKI 或 PKCS#8 PEM 之一。
RSA-OAEP 僅能加密大小有限的訊息。明文最大長度由下列公式決定:(模數位元組數) − 2 × (雜湊位元組數) − 2。對 2048 位元模數(256 位元組)搭配 SHA-256(32 位元組)而言,結果為 256 − 64 − 2 = 190 位元組。對 3072 位元模數(384 位元組)而言,結果為 384 − 64 − 2 = 318 位元組。應用程式通常會以 RSA-OAEP 加密一把隨機產生的 AES 或 ChaCha20 金鑰,再以經身分驗證的對稱加密保護實際酬載。請勿將大型檔案分割成原始 RSA 區塊;本產生器並不會自行發明混合式格式,也無法協助大量檔案加密。
成功匯入 Web Crypto 是必要條件,但並非充分條件。請確認使用者端回報的模數長度無誤、雙方的演算法名稱皆為 RSA-OAEP,以及雜湊與標籤參數相符。接著進行端對端往返測試:以公開金鑰加密一段已知的 UTF-8 訊息,並以私密金鑰驗證其能逐位元組精確還原,所使用的協定必須與實際生產應用程式相同。若還原失敗,請重新產生並再次核對使用者端的預期參數,切勿假設是金鑰本身損毀。產生步驟會鎖定八項外部參數不變量,並透過將兩種 PEM 信封重新匯入 Web Crypto、以公開金鑰加密一段已知的 UTF-8 訊息、再以私密金鑰驗證其精確還原,來測試它們。
如需更深入的說明,請參閱 XOR 加密線上速查表:格式與金鑰。