密碼學透過將資料轉換為只有目標接收者可以理解的格式來保護資料。它對於保護密碼、線上交易和敏感通訊的安全性至關重要。下面,您將了解加密、雜湊以及使用 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);
要建立安全的加密系統,非對稱加密通常是解決方案。它使用兩個金鑰:公鑰用於加密,私鑰用於解密。此設定無需共用單一金鑰即可實現安全通訊。
金鑰對產生
產生公鑰-私鑰對。公鑰是公開共享的,而私鑰則是保密的。
加密
接收者的公鑰對資料進行加密。只有他們的私鑰才能解密,即使被攔截也能保證資料的安全。
解密
接收者使用其私鑰解密資料。
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中文網其他相關文章!