正しく実装されている場合、GCMはほとんどの場合CBCよりも安全であることを確認しました。
ただし、 NodeJSのドキュメント では、代わりにCBCが例として使用されています。キーペアはノード環境に保存されます。
秘密鍵はローカルに保存されており、CBCはローカルファイルの許容可能な暗号化です この回答によると 、十分に安全な実装ですか、またはこのようにGCMを使用する必要があります サンプルコード ?
暗号化されたデータを積極的に操作する攻撃者が脅威モデルに含まれている場合、暗号ブロック連鎖モードは問題になります。これにより、攻撃者は暗号の特定のビットをフリップして、結果のプレーンテキストの同じビットをフリップすることができます。このプロパティは malleability と呼ばれます。整合性を確保するためにMACとペアになっていない場合、CBCはあまり安全ではありません。
ローカルデバイスに格納される秘密キーを暗号化する場合、唯一の要件は機密性です。攻撃者は特定のビットをフリップする可能性がありますが、これにより、代わりに秘密キーが使用できなくなる可能性があります。次の図に示すように、CBCは機密性を十分に提供し、AES-NI拡張がない場合、AES-GCMよりもはるかに高速です。
ソース: kazoo.ga
簡潔に答えると、Node.JSはAES-CBCを使用します。このケースでは、AES-GCMによって提供される追加の利点は重要ではなく、通常AES-CBCの方が速いためです。
上の図では、AES-NIなしのAES-CBCのパフォーマンスが100%のパフォーマンスとして使用されています。関連する他のカテゴリは、AES-128なしのAES-128-GCMです。もちろん、NodeJSがAES-NIをサポートしている場合は、AES-GCMの方が適しています。