paint-brush
Nodejs チュートリアル: Node API サーバーでの OpenPGP 暗号関数@bobnoxious
2,383 測定値
2,383 測定値

Nodejs チュートリアル: Node API サーバーでの OpenPGP 暗号関数

Bob Wright7m2022/10/11
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

ここでは、Node https: サーバー上で実行される API 呼び出しとして提示される、いくつかの一般的な Pretty Good Privacy (PGP) プリミティブ関数を示します。
featured image - Nodejs チュートリアル: Node API サーバーでの OpenPGP 暗号関数
Bob Wright HackerNoon profile picture

ここでは、Node HTTPS: サーバー上で実行される API 呼び出しとして提示される、いくつかの一般的なPretty Good Privacy (PGP)プリミティブ関数を示します。

これらの関数は、電子メール メッセージング プラグインを実装するために使用されるような特定のものではありませんが、一般的な関数を呼び出してより大きなプロセスをサポートするユーザー登録およびログオン認証アプリケーションを対象としています。

ここに示す概念とコードは簡単に適応でき、 https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Serverで共有されています。

PGP は、通常はRSA暗号化方式に基づく公開鍵暗号 (PKC)スキームの実装です。

PGP は通常、電子メール メッセージの署名と暗号化に使用され、受信者によって検証および復号化されます。もう 1 つの大きな用途は、ファイルとドライブを暗号化してその内容を保護することです。

PKC/PGP の特性により、このような交換またはトランザクションの参加者の ID が互いに識別可能になることに注意してください。実際、私たちのユースケースはスキームのこの側面に基づいています。

これは、関連する概念と方法のいくつかの適切な説明を提供する PKC スキームに関する記事です: https://hackernoon.com/public-key-cryptography-simply-explained-e932e3093046

暗号化の技術または方法としての PGP は、かなり前から利用可能であり、多数の異なる言語およびプラットフォームでコーディングまたはプログラムされています。

私たちが使用するごく最近のopenPGPjs JavaScript 実装は、Nodejs で非同期 API として記述されており、次のリポジトリにあります: https://github.com/openpgpjs/openpgpjs

Server.js API プログラム シェル

呼び出し元からの POST フォーム送信を使用する Express Nodejs API フレームワークを介して、openPGPjs の関数へのインターフェイスを提供します。

以下は、Nodejs server.js API プログラムのヘッダー コードです。コードのこのセクションは、組み込むために必要なモジュールを示しています。

このヘッダー コードに続いて、提供するさまざまな機能の API エントリ ポイントをいくつか挿入しました。

これらのさまざまな API 関数をリストした後、HTTPS: サーバーを API 関数用にセットアップして実行するコードの最後の簡単なセクションがあります。

私たちの API は、アクティビティの過程で多数のオブジェクトを処理します。これらのオブジェクトの一部はデータベース内のテーブルに格納され、1 つは別のデータ テーブルの内容から生成されます。

データ テーブルの使用については後で詳しく説明しますが、次のコード ブロックは Node モジュールusersdb_conn.js用であり、API 関数内で一般的に使用するユーザーのmySQLデータベースに接続します。

Server.js PGP 関数

一般的な API シェルについて説明したので、それがユーザーに提示する機能を見てみましょう。

キージェネレーター機能

ほとんどすべての PGP 機能は、その決定と操作において 3 つの重要なオブジェクトのうちの 1 つ以上を使用します。

これらのオブジェクトの最初のものはユーザー オブジェクトです。この場合、POST メッセージを通じて提供されたユーザーの電子メール アドレスを使用してデータベースから抽出したユーザーに関するデータから生成されます。

このユーザー データベースの内容は、登録プロセスの別の部分で以前に入力されたものです。

ここで、以下のリストでは、キー ジェネレーター関数を呼び出すために使用される POST 要求と、構成ファイルからキー タイプとキー ビット長を取得する関数、および特定のユーザー データ値を抽出するために使用する関数を確認できます。データベーステーブルから。

以下の次のリスト セクションでは、上記で取得した名、姓、パスフレーズ、および電子メールのデータ値を使用して、openPGP キー生成関数を呼び出しています。このデモ バージョンでキーが生成されると、それぞれのキーも適切なファイルに書き込まれます。

次の 2 つの関数は、公開鍵と秘密鍵のデータ テーブルに公開鍵と秘密鍵のレコードが存在するかどうかをチェックします。この情報を使用して、この下のリストに示すように、新しいキーを挿入するか、既存のキーを置換/更新するかを決定します。


この次の関数は、デモ生成キー API POST を送信したユーザーのブラウザに、成功を収めたバナーのメッセージ ページを表示します。

上記で調べたこの keygenWebpage 成功バナー表示ページ コードは、API のキー ジェネレーター POST セクションで使用される最後の関数です。

これらの個々の関数がユーザー鍵ペアを生成するという目的のタスクを達成するためには、これらの関数をキューに入れ、各関数でタスクに適した順序で実行し、タスク リストに寄与するメソッドが必要です。 .

したがって、これまで説明してきたキー ジェネレーター API 呼び出しのメイン コードは、この「performAsyncFunctions」モデル関数の一部として実行されます。これは、各関数を順次実行し、各関数が完了するのを待ってから次の関数に進む非同期関数コントローラーです。

キー ジェネレーターの結果

このキー ジェネレーター API 呼び出しが実行されると、通常、テキスト メッセージの暗号化または復号化、署名または検証に使用される 3 つのオブジェクトがすべて使用可能になります。

次のセットアップの下に示すsendPost.htmlという名前の単純な HTML メニュー ページを使用して、API から利用可能な呼び出しをデモンストレーションまたは実行します。

これは、API サーバーに POST 要求を送信する基本的な HTML フォームであり、キー ペアを作成するための 3 つのエントリは、次に示すこのコードで実装されます。

最後に、このデモでは、キー生成プロセスの完了を知らせるバナー ページを表示します。この完成により、PGP スキームで使用する 3 つのコア オブジェクトが生成されます。 1 つは、 firstnamelastnamepassphrase 、およびemail addressの属性を持つuserオブジェクトのものです。

鍵ジェネレーターは、公開鍵オブジェクトと秘密鍵オブジェクトという 2 つの追加の新しいオブジェクトを作成しました。

コンソール ログは、さまざまな機能の結果と進行状況を表示するために使用されます。これは、キー ジェネレーターのデモを実行した場合のコンソール ログの例です。

3 つのオブジェクトに対する 4 つの操作

API 実装で使用する 4 つの重要な操作があります。これらの操作は、メッセージの暗号化、メッセージ署名、メッセージ復号化、およびメッセージの検証です

メッセージの暗号化と署名、または復号化と検証の両方が可能であるため、キー ジェネレーター以外の 6 つの一般的な関数の表が得られます。

メッセージの暗号化では送信者の公開鍵が使用され、メッセージの復号化では受信者の秘密鍵とパスフレーズが使用されるため、これらの補完的な操作では補完的なキーが使用されます。

メッセージ署名では署名者の秘密鍵とパスフレーズが使用されますが、検証では同様に補完的な方法で公開鍵が使用されます。

メッセージの暗号化またはメッセージの復号化は、最も一般的な PGP 機能の 2 つです。それらが API でどのように実装されているかを見てみましょう。

メッセージを暗号化する

以下に示すこのコードは、暗号化 API 呼び出しの始まりです。

ご覧のとおり、最初に POST メッセージから送信者または暗号化者の電子メール アドレスを取得し、続いて暗号化するプレーンテキスト メッセージを暗号化者の公開鍵と共に取得します。 API 呼び出しで提供した電子メールに基づくデータベース テーブル。

送信者の公開鍵とともに暗号化したい平文メッセージを取得したら、次に示すように、openPGP 関数を使用してメッセージを暗号化し続けることができます。

このデモでは、暗号化されたファイルをディスクに書き込んで API 呼び出しを終了します。

上記の Encrypt API 呼び出しで使用されるこれらの関数はすべて、「performEncryptAsyncFunctions」非同期関数を閉じることによって指示された順序で実行され、上記の待機中の関数のシーケンスがエンキューされます。

デモでは、この呼び出しに対して API ユーザーに完了メッセージは表示されませんが、以下に示すようにサーバー ターミナルにログ ファイルが表示されます。

メッセージを復号化する

暗号化されたテキスト メッセージを入手したら、その平文または暗号化されていない内容を読みたいと思うかもしれません。もちろん、これには次のコードによって実行される復号化のプロセスが伴います。

まず、ユーザーの電子メール アドレスの POST メッセージを解析し、続いてファイルから暗号化されたメッセージを読み取る関数を実行します。

このユース ケースでの復号化には、秘密鍵パスフレーズの両方が必要です。ここに示すように、ユーザー データベースからパスフレーズを抽出します。

私たちの PGP スキームは、このパスフレーズでキーを暗号化することを含むキーの「アーマー化」と呼ばれるプロセスによって、追加レベルの保護を提供します。

これら 2 つの前の関数に加えて、データベースから秘密鍵を取得する追加の関数があります。

これらのオブジェクトを使用すると、以下のリストの最初の 2 つの関数を使用して、メッセージを復号化し、平文をファイルに保存できます。

もう一度、上に示したように、「performAsyncFunctions」コンストラクトを使用して、待機リスト内の各関数を順番に実行します。

Encrypt API 呼び出しで行われたように、この Decrypt API 呼び出しによって提供されるインタラクションは、以下のログの例に示すように、コンソール ターミナルに表示されるテキストで構成されます。

その他の API 呼び出し

鍵の生成メッセージの暗号化、およびメッセージの復号化の 3 つの主要な機能に加えて、コードは、暗号化と署名および復号化と検証のAPI 呼び出しと共に、署名検証である他の 4 つの API 関数も提供します。

これらの API のコードとターミナル ログの結果は、 https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Serverの GitHub リポジトリに含まれています。

この Node プログラムを Linux (Ubuntu20) 上のサービスとして実行するためのコードも、GitHub リポジトリに含まれています。

結論

このコードは、本番対応のユーティリティとしてではなく、デモおよび NodeJS API の例として記述されています。うまくいけば、それが私自身のデモの例として書いたことがわかります。

それはあなた自身の目的に簡単に適応できるはずです。コメントや提案は大歓迎です。

こちらにも公開