ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript の暗号化: 実践ガイド
暗号化は、対象の受信者だけが理解できる形式にデータを変換することでデータを保護します。これは、パスワード、オンライン取引、機密通信を保護するために不可欠です。以下では、暗号化、ハッシュ、およびそれらを実装するための JavaScript の使用について学習します。
暗号化は、読み取り可能なデータ (平文) を読み取り不可能な形式 (暗号文) に変換します。承認された当事者のみがプロセスを元に戻すことができます。
主要な概念:
暗号化と復号化に同じキーを使用します。キーは送信者と受信者の間で安全に共有される必要があります。 AES は、データを読み取り不可能な形式に変換することでデータを保護する、広く使用されているタイプの対称暗号化アルゴリズムです。秘密キーに依存し、128、192、または 256 ビットのキー長をサポートし、不正アクセスに対する強力な保護を提供します。 AES は次の場合に不可欠です:
AES の主要な要素には、キー と 初期化ベクトル (IV) が含まれます。キーは当事者間で共有される秘密の値であり、データの暗号化と復号化の方法を決定するものであり、常に機密性を保つ必要があります。 IV はキーと一緒に使用されるランダムな値で、同一の平文が異なる暗号文に暗号化されることを保証し、パターン認識を防ぐためにランダム性を追加します。 IV は公開できますが、同じキーを使用して再利用してはなりません。これらの要素を組み合わせることで、AES はサイバー脅威に効果的に対抗できるようになり、データ セキュリティの基礎となります。
AES は、共有キーと初期化ベクトル (IV) を使用してデータを暗号化し、ランダム性を高めます。
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
安全な暗号化システムを作成するには、多くの場合、非対称暗号化が解決策となります。暗号化には 公開鍵 、復号化には 秘密鍵 の 2 つの鍵が使用されます。この設定により、単一のキーを共有せずに安全な通信が可能になります。
キーペアの生成
公開鍵と秘密鍵のペアが生成されます。公開キーはオープンに共有されますが、秘密キーは機密のままです。
暗号化
受信者の公開キーによってデータが暗号化されます。秘密キーのみが暗号化を解除できるため、たとえ傍受されたとしてもデータは安全に保たれます。
復号化
受信者は秘密キーを使用してデータを復号化します。
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
ハッシュ化は、データを固定長の不可逆文字列 (ハッシュ) に変換します。これは、データの整合性を検証し、パスワードを安全に保存するために一般的に使用されます。
一般的なハッシュ アルゴリズム:
Node.js での文字列のハッシュ化の例
const crypto = require('crypto'); // Generate keys const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 }); const data = "Confidential Data"; // Encrypt const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data)); console.log("Encrypted:", encrypted.toString('base64')); // Decrypt const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log("Decrypted:", decrypted.toString());
Feature | Encryption | Hashing |
---|---|---|
Process | Two-way (encrypt/decrypt) | One-way |
Purpose | Data confidentiality | Data integrity |
Reversible | Yes | No |
Example | AES, RSA | SHA-256, bcrypt |
私のプロジェクト Whisper では、非対称暗号化を使用して匿名チャット メッセージを保護しました。メッセージは受信者の公開キーで暗号化され、受信者だけが秘密キーを使用してメッセージを復号化できるようになります。
クライアント側の React 実装では、暗号化と復号化に crypto-js を使用しました。
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
復号化には秘密キーが使用されます:
const crypto = require('crypto'); // Generate keys const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 }); const data = "Confidential Data"; // Encrypt const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data)); console.log("Encrypted:", encrypted.toString('base64')); // Decrypt const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log("Decrypted:", decrypted.toString());
詳細な例については、Whisper のコードを参照してください。
暗号化により、アプリケーションのデータ セキュリティが強化されます。共有キーのシナリオには AES などの対称暗号化を使用し、公開/秘密キー システムには非対称暗号化を使用します。ハッシュにより、特にパスワードのデータの整合性が保証されます。アプリケーションのニーズに基づいて、適切な暗号化アプローチを選択してください。
共有キーの詳細を読む
公開鍵について詳しく読む
SHA-256
について詳しく読む
SHA-3
について詳しく読む
MD5 について詳しく読む
SHA-1 について詳しく読む
対称暗号化について詳しく読む
AES について詳しく読む
読んでいただきありがとうございます。これについてどう思うか教えてください。もっと知りたい場合、私が間違っていたり、何かを見逃していると思われる場合は、遠慮なくコメントしてください
以上がJavaScript の暗号化: 実践ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。