• crypto
  • edge

Node.js cryptoからWeb Crypto APIへの移行:ガイド付き体験

cryptoからWeb Crypto APIへの移行経験を深堀りし、3つの一般的なシナリオに焦点を当てた包括的なガイドを提供します。

Sijie
Sijie
Developer

はじめに

Web Crypto APIは、新たなJavascript暗号化ツールです。これは、Cloudflare WorkersVercel、さらにはNode.jsを含む現代のブラウザや主要なプラットフォームと互換性があります。このような互換性は、開発者の夢を示しています - あなたの暗号化コードを一度書いて、Web Crypto APIを使って多数のプラットフォームで実行します。

しかし、Node.jsにはすでに長い歴史を持つ "crypto" モジュールがあり、大量のレガシーコードが移行を必要としています。本記事では、この移行経験に深く入り込み、3つの一般的なシナリオに焦点を当てた包括的なガイドを提供します。成功への道筋を照らすことを目指しています。

Web Crypto APIとは何か

Web Crypto APIは、W3CによるJavaScriptのためのオープンスタンダードで、Web Cryptography API specificationで定義された標準化された暗号学の原始集合です。これは、いくつかのブラウザやプラットフォームが自身の非互換性の暗号関数を追加し始めた後に作られました。

APIは鍵生成、暗号化と復号化、デジタル署名、鍵とビット派生、暗号ダイジェストのための原始を提供します。これはSubtleCryptoと呼ばれるインターフェースを中心に構築されており、詳細やチュートリアルはMozillaの MDNドキュメンテーションで見つけることができます。

しかしNode.jsにはすでにcryptoモジュールがあるのではないか

Node.jsの開発者は通常、crypto moduleに精通しています。これは包括的な暗号原始セットを提供します。このモジュールは、Web Crypto APIで定義された同じ暗号操作のためのメカニズムを提供するだけでなく、しばしばより広範な暗号アルゴリズムを含んでいます。

では、なぜまだWeb Crypto APIが必要なのでしょうか?Javascriptがクライアントサイドからサーバー、特にエッジ環境に至るまで多くのプラットフォームや環境で人気を博しているので、プロセスを単純化するためのクロスプラットフォームの暗号ツールを持つことが重要です。

さらに、Web Crypto API標準の機能はすべてpromiseを返し、async/await構文をサポートしています。これは、イベントループをブロックできる同期的なcryptoモジュールに比べて大きな利点です。

そして、興味深いことに、Node.jsはWeb Crypto APIのサポートを追加しています。つまり、ほとんどの場合、Web Crypto APIはほとんどの既知のプラットフォームで完璧です。

Web Crypto APIの使用方法

ほとんどのプラットフォームでは、Web Crypto APIの集合にグローバル crypto オブジェクトを介してアクセスできます。これには3つのトップレベルユーティリティ: getRandomValuesrandomUUID、そして subtle が含まれています。

伝統的なcryptoモジュールと比べて多くの違いがあります。これらは3つの最も一般的な部分にまとめることができます。それらを通じて、既存のコードからどのように移行するか見てみましょう。

#1 ランダム値の生成

cryptoモジュールでは、 randomBytes を呼び出すことでランダム値を生成することができます。

Web Cryptoには getRandomValues という類似の関数がありますが、戻り値は ArrayBuffer なので、それを文字列に変換するための別のステップが必要です。

#2 ハッシュ(またはダイジェスト)

cryptoモジュールでは createHash は容易に使うことができます:

Web Cryptoでは、 subtle.createHash を使うことができます

見ての通り、 ArrayBuffer から16進文字列への変換も必要です。

#3 暗号化と復号化

cryptoモジュールでは、AES暗号化と復号化は次のように実装することができます:

Web Cryptoでは、まず importKey を使ってキーを作成する必要があります:

結論

見ての通り、移行は難しくなく、主な仕事は新しいAPIに合わせて構文を変更し、 TextEncoder を使って ArrayBuffer を解決することです。

Logtoはアイデンティティプロダクトとして、多くの場所で暗号化を使用しています。私たちはcryptoモジュールからWeb Crypto APIに移行しました。この移行により、エッジ環境により適応できるようになり、ブラウザ内でSDKコードを安全に実行することが可能になりました。