一個RSA 金鑰產生器替代方案建置於瀏覽器的 Web Crypto API 之上,可在當前分頁中直接產生全新的 2048 或 3072 位元 RSA-OAEP 金鑰對,搭配 SHA-256、指數 65537、SPKI 公開金鑰輸出,以及 PKCS#8 私密金鑰輸出,而無需呼叫 OpenSSL、ssh-keygen、PuTTYgen 或遠端伺服器。RSA-OAEP 是 PKCS#1 v2.2 中推薦的非對稱加密填補方式,而鎖定 SHA-256 加上公開指數 65537,可消除那些曾削弱舊版部署的傳統預設值。由於產生過程會經過平台的 Web 密碼學實作,因此質數搜尋與金鑰組裝絕不會離開使用者的機器,儘管瀏覽器擴充功能、剪貼簿管理程式以及任何背景程序仍處於該邊界之外。匯出的 PEM 區塊遵循 RFC 7468 的格式規則,可貼入任何使用 RSA-OAEP 公開金鑰進行加密的應用程式。以相同的設定執行兩次會分別回傳不同的金鑰對,這是隨機質數搜尋的預期行為。下面的章節將說明此替代方案取代了哪些項目、如何使用,以及在正式環境中信任該輸出之前所需的驗證步驟。

為何基於瀏覽器的產生器是實用的替代方案
傳統的 RSA 金鑰產生流程要求使用者安裝工具鏈。Linux 上的 OpenSSL 需要套件,ssh-keygen 假設有 shell 環境,PuTTYgen 執行於 Windows,而語言函式庫則需要執行階段環境加上正確的繫結。每條路徑都增加了摩擦力與版本介面,而預設值可能會漂移至不安全的選擇,例如 1024 位元的模數、SHA-1 或 PKCS#1 v1.5 填補方式。基於瀏覽器的RSA 金鑰產生器透過委派給平台經過稽核的 Web 密碼學實作,並拒絕在使用者介面中暴露不安全的選擇,來迴避該介面。固定的參數組合正是其特色:沒有 1024 位元金鑰的下拉選單、沒有原始 RSA 的切換開關,也沒有自訂指數的欄位,這消除了最常見的誤用路徑。
同樣的特性也適用於金鑰傳輸。伺服器端的產生器在請求生命週期內必須被信任以處理私密金鑰位元組,而 pastebin 類型的網站則會在該次工作階段之外的記憶體或磁碟中保留這些位元組。瀏覽器工具完全在用戶端產生、匯出並呈現 PEM,然後將位元組直接交給剪貼簿或下載動作。沒有任何資料會被上傳,這是工具本身劃定的邊界,也是每位操作員應在產生過程中透過觀察網路面板來重新驗證的邊界。
產生器鎖定了哪些參數
此工具會使用固定的演算法名稱、雜湊、模數長度與公開指數來呼叫 SubtleCrypto.generateKey,然後將產生的 CryptoKey 物件包裝成 PEM。鎖定參數很重要,因為參數不符正是系統之間解密失敗的隱性原因。此合約刻意設定得很窄:
- 演算法:RSA-OAEP,僅定義用於加密與解密。
- 雜湊:SHA-256,可避免 SHA-1 碰撞干擾 OAEP 標籤處理。
- 模數:2048 或 3072 位元,由使用者在產生前選擇。
- 公開指數:65537,即幾乎所有 RSA 函式庫都接受的 F4 質數。
- 公開金鑰封套:SubjectPublicKeyInfo PEM,依 RFC 7468 以 64 欄位元進行 base64 換行的 ASN.1。
- 私密金鑰封套:PKCS#8 未加密 PEM,以 64 欄位元進行 base64 換行的 ASN.1。
產生過程為非同步,作業識別可防止使用者在產生途中變更模數時,較舊的請求覆寫較新的設定。內部測試架構會將匯出的 SPKI 與 PKCS#8 重新匯入 Web Crypto,使用公開金鑰加密已知的 UTF-8 訊息,並以私密金鑰進行精確還原驗證;若任何步驟失敗,所顯示的 PEM 將無法通過該架構,這就是為何往返測試被視為必要而非可選的原因。
選擇金鑰大小
兩種支援的大小並非在每個工作流程中都能互換。此選擇會影響瀏覽器執行緒上的產生時間、PEM 區塊的大小,以及用戶端的每次操作成本。
| 屬性 | 2048 位元 | 3072 位元 |
|---|---|---|
| 模數長度 | 2048 位元 | 3072 位元 |
| 瀏覽器產生時間 | 比 3072 位元選項產生速度更快 | 較慢,質數搜尋會隨模數長度呈超線性擴增 |
| 互通性 | 廣泛,幾乎所有 RSA 用戶端皆接受 | 在現代技術堆疊上廣泛;採用前請驗證舊版接收端 |
| 安全邊際 | 目前應用程式的標準 | 較大的邊際,適用於更長的金鑰保留期 |
| 建議使用時機 | 新整合的預設選擇 | 更高保證度的資料或壽命更長的密文 |
除非應用程式文件或合規要求指定更大的模數,否則請選擇 2048。當密文生命週期超過數年,或接收系統明確要求時,請選擇 3072。此工具不提供 1024 位元金鑰,因為該模數長度已不再被視為安全。
在瀏覽器中產生金鑰對
- 驗證目標應用程式。確認消費者端預期使用 RSA-OAEP 搭配 SHA-256、指數 65537,以及兩種 PEM 封套之一。若應用程式預設為 SHA-1 或 PKCS#1 v1.5 填補方式,產生的金鑰雖能匯入,但往返測試將會失敗。
- 選擇模數長度。為廣泛互通性選擇 2048 位元,或為更大的安全邊際選擇 3072 位元。在效能較低的硬體上,由於質數搜尋為主要成本,請為 3072 位元的產生預留額外時間。
- 執行產生作業。觸發產生動作。工具會使用鎖定的參數呼叫 crypto.subtle.generateKey,並等待 Promise 解析後再進行匯出。在 PEM 區塊出現之前請勿再次點擊,因為每次點擊都會產生新的金鑰對,而舊的金鑰對將會遺失。
- 複製公開金鑰。取出以 -----BEGIN PUBLIC KEY----- 開頭並以 -----END PUBLIC KEY----- 結尾的區塊,將其分發至任何需要為此持有者加密的系統。
- 將私密金鑰直接匯入受保護的儲存區。取出以 -----BEGIN PRIVATE KEY----- 開頭的區塊,並將其貼入密鑰管理員、加密金鑰儲存區或硬體支援的儲存區。請勿將其儲存於開發資料夾的磁碟中,亦請勿貼入程式碼審查中。
- 關閉分頁並清除剪貼簿。私密 PEM 僅在導覽之前存在於元件記憶體中,但剪貼簿仍會保留該內容,直到被覆寫。請使用無關的文字覆寫剪貼簿,或讓作業系統自行清除剪貼簿記錄。
解讀 PEM 區塊:SPKI 與 PKCS#8
會產生兩個 PEM 標頭,各自描述不同的內容。以 BEGIN PUBLIC KEY 開頭的區塊包含 ASN.1 SubjectPublicKeyInfo 結構:宣告 RSA-OAEP 搭配 SHA-256 的演算法識別碼,後接模數與公開指數 65537。此區塊旨在供公開分享。以 BEGIN PRIVATE KEY 開頭的區塊則包含 PKCS#8 金鑰內容:相符的私密指數、相同的模數,以及有效解密所需的 CRT 參數。取得私密區塊的任何人都能解密以相符公開金鑰加密的所有密文,因此該區塊被視為與資料庫密碼同等級別的秘密。
兩個封套皆未加密。PKCS#8 支援以密碼加密的變體,但此工具刻意匯出未加密的形式,以便位元組可直接移至下游的受保護儲存區。若需要受密碼保護的 PEM,請透過獨立的加密 PEM 工具鏈來包裝 PKCS#8 位元組,而非在產生器內部重新加密。
分發公開金鑰,保護私密金鑰
公開金鑰的分發不受限制:可透過電子郵件傳送、貼入組態設定,或提交至使用該金鑰的應用程式程式碼旁。私密金鑰的保護則恰恰相反。請將私密 PEM 移至密鑰管理員或 HSM 支援的金鑰儲存區,以角色型存取控制限制存取,並以與管理其他加密資料相同的控制措施進行備份。請勿將其放入原始碼控制、工單系統、分析工具、瀏覽器同步、螢幕擷圖或一般筆記中。若私密金鑰外洩,請立即輪替:產生新的金鑰對、重新分發新的公開金鑰,並重新加密舊私密金鑰本可解開的任何資料。
當為匯入目的而將私密金鑰交給團隊成員時,請優先使用不會記錄承載資料的短效期頻外通道:直接傳輸至其金鑰儲存區、密碼管理員分享,或暫時上傳至受控的構件儲存區。稽核記錄與剪貼簿管理程式皆會保留純文字副本,且保留時間遠超過使用者的預期。
執行端對端加密測試
成功的匯入並不能證明金鑰可用。接收系統可能預設為不同的雜湊、不同的標籤或不同的遮罩產生函式,而 OAEP 在這些不符的情況下將會靜默地無法還原明文。唯一可靠的檢查方式,是使用應用程式實際將使用的協定進行真正的往返測試:
- 在目標函式庫中以公開金鑰加密已知的 UTF-8 字串。
- 透過應用程式使用的相同傳輸方式傳送密文。
- 在目標函式庫中以私密金鑰解密,並與原始字串進行比對。
若還原失敗,問題幾乎總是出在 OAEP 參數或位元組編碼上,而非模數本身。輸入為 UTF-8 位元組,輸出為相同的 UTF-8 位元組,是唯一可接受的結果。
此產生器無法取代的部分
此工具刻意設定得很窄。它不會產生 RSA-PSS 簽章金鑰、X.509 憑證、憑證簽署請求、SSH 金鑰或 JSON Web 金鑰。對於 SSH 類型的工作流程,請遵循關於 PEM 對 OpenSSH 的指引,以取得基於瀏覽器的替代方案。對於 TLS 或正式環境的身分識別,請優先採用所屬平台或硬體安全模組所提供的金鑰產生工作流程。RSA 僅能加密有限大小的訊息,因此應用程式通常會使用 RSA-OAEP 加密一個隨機對稱金鑰,並以經驗證的對稱加密保護實際酬載;此工具並不會發明混合檔案格式,而原始 RSA 區塊切割亦不安全。
產生後的格式轉換必須保留演算法參數與私密金鑰的機密性。捨棄 SHA-256 宣告或重新編碼指數的 PEM 對 JWK 轉換,將產生一個能順利匯入但無法解密的 JWK。請於每次轉換後使用上述往返測試重新驗證。