密码学通过将数据转换为只有目标接收者可以理解的格式来保护数据。它对于保护密码、在线交易和敏感通信的安全至关重要。下面,您将了解加密、散列以及使用 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中文网其他相关文章!