Nodejs 組み込み暗号化モジュールを使用してピアツーピアの暗号化と復号化を実現する詳細な説明

Nodejs 組み込み暗号化モジュールを使用してピアツーピアの暗号化と復号化を実現する詳細な説明

暗号化と復号化は、通信のセキュリティを確保するための重要な手段です。すでに多くの暗号化アルゴリズムがあり、成熟したソフトウェアパッケージが利用可能です。これにより、アプリケーション開発者の負担が大幅に軽減されます。サードパーティが提供する暗号化および復号化ライブラリを使用するだけで済みます。実際、Node.jsは非常に強力で便利な暗号化および復号化モジュールcryptoを提供しています。単純な暗号化および復号化機能を実装するために、サードパーティのNPMライブラリを使用する必要はありません。結局のところ、暗号化と復号化を使用する目的は、通信のセキュリティを確保することです。非公式のサードパーティライブラリを使用すると、常にバックドアなどが追加される可能性があります。Node.jsに付属のcryptoモジュールを使用すると、暗号化のセキュリティを最大限に高めることができます。

ハッシュ値計算 crypto.Hash

ハッシュ値の計算は通常、データの整合性と正確性を検証するために使用されます。受信したデータが送信したデータとまったく同じであることを確認する必要がある場合、送信データのハッシュ値と受信データのハッシュ値をそれぞれ計算できます。単純な比較では、2 つの同一データのハッシュ値は同じであることがわかります。ハッシュ値を逆にして元のデータを復元することはできないため、データの検証にのみ使用できます。では、Node.js ではどのように使用すればよいのでしょうか?

サンプルコード

const crypto = require('crypto');
const ハッシュ = crypto.createHash('sha256');

hash.update('ハッシュするデータ');
console.log(hash.digest('hex'));
// 印刷:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

上記のコードは、公式の Node.js デモ コードからコピーしたものです。文字列またはデータ セットのハッシュ値を計算するという、最も簡単な方法を選択しました。これは最も一般的に使用される方法でもあります。 crypto.Hash によって実装されるハッシュ アルゴリズムは、計算演算子として固定の秘密語 Secret を使用します。Node.js には、これに類似した暗号化クラス crypto.Hmac もありますが、秘密語 Secret を変更できます。

可変ハッシュ計算 crypto.Hmac

サンプルコード

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', '秘密');

hmac.update('ハッシュするデータ');
console.log(hmac.digest('hex'));
// 印刷:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

crypto.Hmac の使い方は crypto.Hash と非常に似ています。唯一の違いは、カスタマイズ可能な秘密語 Secret が追加されていることです。カスタマイズされた秘密語 Secret を使用する目的の 1 つは、パスワードを保存する際のセキュリティを向上させることです。結局のところ、デフォルトの秘密語 Secret のハッシュ アルゴリズム関数を使用すると、どのようなアルゴリズムが使用されているかを知っていれば、ブルート フォース衝突によってパスワードを取得できます。ただし、カスタマイズされた秘密語 Secret でハッシュ関数を使用すると、徹底的な方法を使用しても解読することはほぼ不可能です。

対称暗号化と復号化

対称暗号化と復号化とは、暗号化側と復号側の両方が同じ秘密語 Secret を使用して暗号化と復号化アルゴリズムの操作を実行することを意味します。この暗号化アルゴリズムは公開鍵と秘密鍵を必要とせず、より便利に使用できます。さらに、ハッシュ アルゴリズムとは異なり、対称暗号化と復号化は双方向で可逆的です。

Node.js は多くの対称暗号化アルゴリズムをサポートしていますが、どの暗号化アルゴリズムが使用されるかは、コンピューターにインストールされている OpenSSL によって異なります。Node.js は OpenSSL を呼び出すだけです。これにより、文書内で暗号化アルゴリズムの情報を見つける方法がないという問題が発生します。問題がどこにあるかは後でわかります。

対称暗号化の使用プロセス

暗号化サンプルコード

 const crypto = require('crypto');

 定数アルゴリズム = 'aes-192-cbc';
 const password = 'キーを生成するために使用されるパスワード';
// 代わりに非同期の `crypto.scrypt()` を使用してください。
 const key = crypto.scryptSync(パスワード、'salt'、24);
// 静的 iv の代わりにランダム iv を生成するには `crypto.randomBytes` を使用します
// ここに表示されています。
 const iv = Buffer.alloc(16, 0); // 初期化ベクトル。

 const cipher = crypto.createCipheriv(アルゴリズム、キー、iv);

 let encrypted = cipher.update('いくつかのクリアテキストデータ', 'utf8', 'hex');
 暗号化 += cipher.final('hex');
 console.log(暗号化済み);
// 印刷: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa

このコードを段階的に説明しましょう。

定数アルゴリズム = 'aes-192-cbc';

この行は、使用される暗号化アルゴリズムを定義します。通常、中央で - で接続された 3 つの部分で構成されます。最初の部分は暗号化アルゴリズム名 aes、2 番目の部分は暗号化の長さ 192 ビット、3 番目の部分は暗号化認証方法 (この部分は誤解される可能性があります) cbc です。

 const key = crypto.scryptSync(パスワード、'salt'、24);

この行はキーを生成します。最後の数字 24 に注意してください。これは生成されたキーの長さです。最小値は 8 で、最大値の制限はありませんが、8 の倍数である必要があります。キーの長さは、使用する暗号化アルゴリズムに関係します。この情報はドキュメントに含まれていないため、使用時に試行し続けることしかできません。そうしないと、エラーが発生します。

 const iv = Buffer.alloc(16, 0); // 初期化ベクトル。
 const cipher = crypto.createCipheriv(アルゴリズム、キー、iv);

6 行目は初期化ベクトルを作成しますが、これは非常に重要なポイントですが、ドキュメントでは説明されていません。IV の長さも重要です。現在わかっているのは、長さは 8 の倍数である必要があり、長さは使用するアルゴリズムのビット数に関係しているということだけです。ただし、ドキュメントには明確な説明がないため、使用時に試行錯誤するしかありません。

残念なことに、キーと初期化ベクトルの 2 つの主要なパラメータの長さは、Node.js のドキュメントに明確に記載されていません。その結果、それらを使用するときには、暗号化アルゴリズムに関連する情報を調べるか、手動で 1 つずつ試す必要があり、非常に不便です。

 let encrypted = cipher.update('いくつかのクリアテキストデータ', 'utf8', 'hex');
 暗号化 += cipher.final('hex');

この 2 行は非常に単純です。入力文字列を暗号化するだけです。update(...,'utf8', 'hex') では、utf8 は暗号化前の文字列のエンコード形式であり、hex は暗号化後の出力のエンコード形式です。最後に、暗号化された文字列の後に終了文字を追加する必要があります。このタスクは final('hex') によって完了します。Hex は出力の文字エンコード形式でもあります。

対称復号化プロセス

復号化サンプルコード

const crypto = require('crypto');

定数アルゴリズム = 'aes-192-cbc';
const password = 'キーを生成するために使用されるパスワード';
// 代わりに非同期の `crypto.scrypt()` を使用してください。
const key = crypto.scryptSync(パスワード、'salt'、24);
// IV は通常、暗号文とともに渡されます。
const iv = Buffer.alloc(16, 0); // 初期化ベクトル。

const decipher = crypto.createDecipheriv(アルゴリズム、キー、iv);

// 上記は暗号化部分です // 暗号化キーと復号化キーおよび初期化ベクトルは同じである必要があるため // そのため暗号化と復号化が組み合わされます // 同じアルゴリズム、キー、および初期化ベクトルを使用して暗号化されます。
定数暗号化 =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decrypted = decipher.update(encrypted, 'hex', 'utf8'); とします。
復号化 += decipher.final('utf8');
console.log(復号化済み);
// 印刷: クリアテキストデータ

復号化は暗号化の逆のプロセスであり、注意すべき点は同じです。つまり、キー Key と初期化ベクトルの 2 つのパラメータの長さです。もう 1 つの注意点は、decipher.update 入力の最初のパラメータは Buffer 型ではなく、文字列のみであることです。個人的には、Buffer を使用した方がパフォーマンスが向上するはずだと感じており、将来的にはこのタイプのサポートが追加される可能性があります。

結論

Nodejs の組み込み暗号化モジュールを使用してピアツーピア暗号化と復号化を実装する方法についての記事はこれで終わりです。Nodejs ピアツーピア暗号化と復号化の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • NodeJs の高メモリ使用量のトラブルシューティング実戦記録
  • Node.js の非同期イテレータの詳細な説明
  • Node.js組み込みモジュールの詳細な説明
  • Nodejs モジュール システムのソースコード分析
  • JS と Nodejs におけるイベント駆動型開発についての簡単な説明
  • Nodejs でモジュール fs ファイルシステムを使用する方法
  • Node.js コード実行をバイパスするためのヒントのまとめ
  • Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する
  • Nodejs エラー処理プロセス記録
  • Node.js を使用して C# のデータ テーブル エンティティ クラス生成ツールを作成する方法

<<:  Mac で MySQL バージョン 5.6 のパスワードを設定する方法

>>:  Windows Server 2019 のインストール (グラフィカル チュートリアル)

推薦する

Docker に Zookeeper を素早くインストールする方法の詳細なチュートリアル

Docker で Zookeeper を素早くインストール会社を変わってから長らくZookeeper...

CSSはフロートをシミュレートして、画像の左右を囲む中央テキストの効果を実現します。

画像の周囲にテキストを折り返すとは何ですか?これは次の図の効果です。 エフェクトのCSSコードはここ...

MySQLはIDに適切なデータ型を選択します

目次分散IDソリューションの概要データベース自動増分IDデータベースマルチマスターモード数値セグメン...

Vue が Bibibili のホームページを模倣する際の問題

エンジニアリング構造プロジェクトは2つの部分に分かれています。bilibili-apiはAPIインタ...

innodb_flush_method 値メソッド (例の説明)

innodb_flush_methodのいくつかの典型的な値 fsync: InnoDB は fs...

CSS スタイルの優先順位とカスケード順序に関する議論

一般的に: [重要なフラグ1つ] > [特別なフラグ4つ] > 宣言順!importan...

ウェブページのドロップダウンリストとdivレイヤーのカバーの問題を選択する

HTML の select 要素に関する質問は、さまざまな場所で提起されています。最近のプロジェクト...

JSはクリックドロップ効果を実装します

jsはクリックとドロップの特殊効果を実現します。まずは効果画像を見てみましょうさっそく始めましょう。...

Vuex はシンプルなショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのvuexの具体的なコードを参考までに共有して...

MySQL内部一時テーブルの具体的な使用法

目次連合テーブルの初期化ステートメントの実行連合の結果ユニオンオールグループ化十分なメモリステートメ...

Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

1. 分散ストレージシステムの概要情報技術の継続的な発展により、利便性がもたらされる一方で、データ量...

MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明

MySQL マスタースレーブ設定MySQL のマスター/スレーブ レプリケーションと読み取り/書き込...

JavaScript 文字列オブジェクトメソッド

目次文字列オブジェクトのメソッド方法 1: indexOf() (推奨)方法 2: search()...

Centos8.3、dockerデプロイメントspringbootプロジェクトの実際のケース分析

導入現在、k8s は非常に人気があり、それについて学ぶために本を購入しました。しかし、k8s では数...