crypto (npm)、node-forge、pem、pem-jwk は、暗号化操作、証明書の生成、鍵形式の変換などを扱うライブラリですが、それぞれ動作環境と依存関係が異なります。crypto は Node.js 組み込み模块の shim 版ですが、現在は非推奨です。node-forge は純粋な JavaScript で書かれており、ブラウザでも動作します。pem は OpenSSL コマンドをラップしており、サーバー環境での証明書管理に適しています。pem-jwk は PEM 形式と JWK 形式の変換に特化した utility です。
crypto (npm)、node-forge、pem、pem-jwk は、セキュリティ関連の処理を行う際に候補となるパッケージですが、それぞれ役割と制約が明確に異なります。実務では、環境依存やメンテナンス状況を理解せずに選ぶと、セキュリティリスクや移植性の問題に直面します。ここでは、それぞれの違いを具体的なコード例と比較しながら解説します。
ライブラリがどこで動作するかは、アーキテクチャ決定における最初の重要なポイントです。
crypto (npm) は、Node.js 組み込み模块の代わりとして作られましたが、現在は非推奨です。
// crypto (npm): 非推奨パッケージ
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('data').digest('hex');
// ⚠️ 警告: この npm パッケージは使用しないでください
node-forge は、純粋な JavaScript で実装されています。
// node-forge: 純粋な JavaScript
const forge = require('node-forge');
const md = forge.md.sha256.create();
md.update('data');
const hash = md.digest().toHex();
// ✅ ブラウザでもサーバーでも動作可能
pem は、OpenSSL コマンドラインツールをラップしています。
// pem: OpenSSL 依存
const pem = require('pem');
// システムに openssl コマンドが必要
pem.createCertificate({ days: 1, selfSigned: true }, (err, keys) => {
// 証明書生成
});
pem-jwk は、形式変換に特化した lightweight な utility です。
// pem-jwk: 形式変換専用
const pemToJwk = require('pem-jwk').pemToJwk;
// 変換機能のみ提供
const jwk = pemToJwk(pemString, 'public');
鍵や証明書を生成する際、ライブラリによって提供される機能の深さが異なります。
crypto (npm) は、組み込み模块と同様に低レベルな操作を提供します。
// crypto (npm): 鍵生成
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
modulusLength: 2048
});
// ⚠️ 非推奨パッケージによる実装
node-forge は、PKI 関連の機能も純粋 JS で提供します。
// node-forge: 鍵と証明書生成
const keys = forge.pki.rsa.generateKeyPair({ bits: 2048 });
const cert = forge.pki.createCertificate();
cert.publicKey = keys.publicKey;
// ✅ 外部ツール不要で完結
pem は、証明書生成を簡単に行うことに特化しています。
// pem: 証明書生成の簡易化
pem.createCertificate({ days: 365, selfSigned: true }, (err, result) => {
const cert = result.certificate;
const key = result.serviceKey;
// ✅ 開発環境などで快速に証明書を用意できる
});
pem-jwk は、鍵生成機能を提供していません。
// pem-jwk: 鍵生成は非対応
// 鍵生成は crypto や node-forge で 수행
// ここでは変換のみ
// const jwk = pemToJwk(existingPem, 'private');
// ❌ 鍵生成機能はありません
異なるシステム間で鍵をやり取りする際、形式変換が不可欠です。
crypto (npm) は、基本的な形式変換をサポートしますが、JWK などは追加処理が必要です。
// crypto (npm): 形式変換
// JWK への変換は標準ではサポートされていないため自力実装が必要
// const jwk = ... (manual implementation)
// ⚠️ 手間がかかる
node-forge は、様々な形式の変換関数を持っています。
// node-forge: PEM 出力
const pem = forge.pki.privateKeyToPem(keys.privateKey);
// ✅ 標準的な形式変換は充実
pem は、証明書情報の読み取りに強みがあります。
// pem: 証明書情報読み取り
pem.readCertificateInfo(certPem, (err, info) => {
console.log(info.subject);
// ✅ 証明書の中身を確認しやすい
});
pem-jwk は、PEM と JWK の変換に特化しています。
// pem-jwk: PEM <-> JWK 変換
const jwk = require('pem-jwk').pemToJwk(pemString, 'public');
const pem = require('pem-jwk').jwkToPem(jwk, 'private');
// ✅ この用途なら最適
セキュリティライブラリを選ぶ際、メンテナンス状況は最も重要な要素です。
crypto (npm) は、公式に非推奨となっています。
crypto 模块を使用してください。// crypto (npm): 非推奨
// ❌ 使用しないこと
// ✅ 代わりに require('crypto') (Node.js built-in) を使用
node-forge は、長くメンテナンスされているプロジェクトです。
// node-forge: メンテナンス状況
// ✅ 積極的にメンテナンスされている
const forge = require('node-forge');
pem は、OpenSSL のバージョン依存に注意が必要です。
// pem: 依存管理
// ⚠️ システムの OpenSSL バージョン管理が必要
const pem = require('pem');
pem-jwk は、機能限定のためリスクは低いです。
// pem-jwk: 限定機能
// ✅ 機能限定のため表面積は小さい
const pemToJwk = require('pem-jwk').pemToJwk;
| 機能 | crypto (npm) | node-forge | pem | pem-jwk |
|---|---|---|---|---|
| 環境 | Node.js (非推奨) | ブラウザ + Node.js | Node.js (OpenSSL 必要) | 環境依存小 |
| 依存 | なし (shim) | なし (純粋 JS) | OpenSSL バイナリ | なし |
| 鍵生成 | ✅ (非推奨) | ✅ | ✅ (証明書中心) | ❌ |
| 形式変換 | ⚠️ (手動) | ✅ (多形式) | ⚠️ (読み取り中心) | ✅ (PEM/JWK) |
| メンテナンス | ❌ (非推奨) | ✅ | ⚠️ (依存注意) | ✅ |
crypto (npm) は、歴史的な理由で存在するパッケージですが、現在は使用すべきではありません。Node.js 組み込みの crypto 模块が常に第一選択肢です。
node-forge は、ブラウザで暗号化処理を行う必要がある場合や、サーバー環境で OpenSSL をインストールできない場合に最適な選択肢です。純粋な JavaScript で完結するため、デプロイの複雑さを減らせます — ただし、処理速度はネイティブより劣ります。
pem は、開発環境や管理サーバーで快速に証明書を発行したい場合に便利です。ただし、本番環境では OpenSSL のバージョン管理やセキュリティパッチ適用を徹底する必要があります。
pem-jwk は、特定の形式変換が必要な場合にピンポイントで利用します。汎用ライブラリとしてではなく、変換ツールとして依存に追加するのが適切です。
結論: 基本的には Node.js 組み込み crypto 模块を軸にし、ブラウザ対応が必要なら node-forge を併用します。pem は開発支援ツールとして、pem-jwk は変換専用として、必要最小限の範囲で導入するのが安全です。
新しいプロジェクトでは crypto (npm) を使用しないでください。これは非推奨パッケージであり、Node.js 組み込みの crypto 模块を使用すべきです。組み込み模块は性能が良く、セキュリティ更新も確実です。
ブラウザ環境で暗号化処理が必要な場合や、OpenSSL がインストールされていない環境で動作させる必要がある場合に選択します。純粋な JavaScript で実装されているため、移植性が高いですが、処理速度はネイティブ模块より遅いです。
Node.js サーバー上で OpenSSL コマンドを安全に実行できる環境であれば、証明書の生成や情報取得に便利です。ただし、バイナリ依存があるため、サーバーレス環境やブラウザでは使用できません。
PEM 形式の鍵を JWK 形式に変換する、またはその逆の変換が必要な場合にのみ使用します。汎用的な暗号化ライブラリではないため、他のライブラリと組み合わせて利用するのが一般的です。
This package is no longer supported and has been deprecated. To avoid malicious use, npm is hanging on to the package name.
It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.
Please contact support@npmjs.com if you have questions about this package.