從 Node.js 加密模組遷移到 Web Crypto API:一個指導性的體驗
深入探索從加密模組遷移到 Web Crypto API 的體驗,提供針對三種常見情況的完整指南。
介紹
Web Crypto API 是一個新的 JavaScript 密碼學工具。它與現代瀏覽器和主流平臺相容,包括 Cloudflare Workers 和 Vercel,以及 Node.js。這種互操作性意味著開發者的夢想——撰寫一次加密代碼,通過 Web Crypto API 在無數平臺上運行。
然而,Node.js 已經有一個歷史悠久的 "crypto" 模組,這就留下了大量的遺留代碼需要遷移。在本文中,我們將深入探討遷移經驗,提供針對三種常見情況的完整指南。我們的目標是指引成功的遷移之路。
什麼是 Web Crypto API
Web Crypto API 是 W3C 為 JavaScript 制定的開放標準,它是一組在 Web Cryptography API 規範中定義的標準化加密原語。它是在多個瀏覽器和平臺開始添加各自的不可互操作加密功能後創建的。
該 API 提供了密鑰生成、加密和解密、數位簽名、密鑰和位派生以及加密摘要的原語。它圍繞著一個名為 SubtleCrypto 的介面,更多詳細資訊和教程可以在 Mozilla MDN 文檔中找到。
但 Node.js 已經有 crypto 模組了?
Node.js 開發者通常熟悉 crypto 模組。它提供了一整套的加密原語。這個模組不僅為 Web Crypto API 中定義的相同加密 操作提供了機制,而且通常包含更廣泛的加密算法。
那為什麼我們仍然需要 Web Crypto API?隨著 JavaScript 在許多平臺和環境中變得流行,從客戶端到服務器,特別是在邊緣設備中,擁有一個跨平臺的加密工具以簡化流程是很重要的。
此外,Web Crypto API 標準中的功能都返回 promises 並支援 async/await 語法。這對於同步且可能阻塞事件循環的 crypto 模組而言是一個顯著的優勢。
而且,有一個有趣的事情是 Node.js 添加了對 Web Crypto API 的支持,這意味著,在大多數情況下,Web Crypto API 在大多數已知平臺上都是完美的。
使用 Web Crypto API
在大多數平臺上,Web Crypto APIs 集合可通過全域的 crypto
對象訪問,其中包括三個頂級實用工具:getRandomValues
,randomUUID
和 subtle
。
與傳統加密模組相比有很多不同。它們可以總結為三個最常見的部分。讓我們來逐一了解如何從現有代碼遷移。
#1 生成隨機值
在 crypto 模組中,你可以通過調用 randomBytes
生成隨機值
在 Web Crypto 中有一個類似的函數 getRandomValues
,但返回值是 ArrayBuffer
,所以我們需要另一個步驟將其轉換為字串。
#2 雜湊 (或摘要)
在 crypto 模組中,使用 createHash
很簡單:
在 Web Crypto 中,我們可以使用 subtle.createHash
如你所見,從 ArrayBuffer
轉換為十六進位字串也是必要的。
#3 加密和解密
在 crypto 模組中,可以通過以下方式實現 AES 加密和解密:
在 Web Crypto 中,我們需要先用 importKey
創建鍵:
結論
如你所見,遷移並不困難,主要工作是改變語法以適應新的 API 並使用 TextEncoder
處理 ArrayBuffer
。
作為一個身份產品,Logto 在許多地方使用加密。我們已經從 crypto 模組遷移到 Web Crypto API。這一轉變使我們能夠更好地適應邊緣環境,並能夠在瀏覽器中安全地執行 SDK 代碼。