本文总结下日常工作中用到的加密算法相关的知识
本节对应的代码在
_demo/encryption
下
加密算法是一组数学运算和规则,用于将信息从一种形式(明文)转换为另一种形式(密文),以便保护信息的安全性。
日常开发中用到加密算法的地方有:
- 保护用户隐私: 如密码和个人资料。通过使用加密,即使在数据传输过程中被拦截,攻击者也难以获取有用的信息
- 安全数据传输: 在 Web 开发中,通过 HTTPS 协议实现的安全数据传输依赖于加密算法。这确保了在客户端和服务器之间传输的数据是加密的,防止中间人攻击和数据泄露。
- 数字签名和认证: 加密算法可用于生成和验证数字签名,以确保数据的完整性和身份的真实性。这在构建安全的身份验证系统和 API 通信中尤为重要。
散列函数(Hash Function):散列函数将任意大小的数据映射为固定大小的散列值。这是一种单向的过程,无法从散列值还原出原始数据。
将明文(原始数据)转换为密文(经过处理的数据)的过程。加密使用算法和密钥来确保只有授权的实体能够理解或还原数据。
将密文还原为明文的过程,使用相同的算法和密钥。只有拥有正确密钥的实体才能够成功解密数据。
在对称加密中,相同的密钥用于加密和解密数据。这意味着发送方和接收方都共享相同的密钥。
非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。信息加密后,只有持有私钥的实体才能解密。
- 常见的 对称加密 算法: DES、3DES、AES 等
- 常见的 非对称算法 : RSA、DSA 等
- 散列算法 : SHA-1、MD5 等
nodejs 中的 crypto 模块内置了对称加密、非对称加密和散列算法的实现。
const crypto = require("crypto");
// 加密
function encrypt(text, key) {
const cipher = crypto.createCipher("aes-256-cbc", key);
let encrypted = cipher.update(text, "utf-8", "hex");
encrypted += cipher.final("hex");
return encrypted;
}
// 解密
function decrypt(encryptedText, key) {
const decipher = crypto.createDecipher("aes-256-cbc", key);
let decrypted = decipher.update(encryptedText, "hex", "utf-8");
decrypted += decipher.final("utf-8");
return decrypted;
}
// 使用示例
const originalText = "Hello, World!";
const secretKey = "supersecretkey";
const encryptedText = encrypt(originalText, secretKey);
console.log("Encrypted Text:", encryptedText);
const decryptedText = decrypt(encryptedText, secretKey);
console.log("Decrypted Text:", decryptedText);
RSA 是一种基于大数分解的非对称加密算法。它使用一对公钥和私钥,其中公钥用于加密,私钥用于解密。RSA 也被用于数字签名。
应用: RSA 广泛用于保护数据的传输和身份验证,如 HTTPS 通信和数字证书
const crypto = require("crypto");
// 生成密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 2048,
});
// 加密
function encryptWithPublicKey(text) {
const bufferText = Buffer.from(text, "utf-8");
const encrypted = crypto.publicEncrypt(publicKey, bufferText);
return encrypted.toString("base64");
}
// 解密
function decryptWithPrivateKey(encryptedText) {
const bufferEncryptedText = Buffer.from(encryptedText, "base64");
const decrypted = crypto.privateDecrypt(privateKey, bufferEncryptedText);
return decrypted.toString("utf-8");
}
// 使用示例
const originalText = "Hello, World!";
const encryptedText = encryptWithPublicKey(originalText);
console.log("Encrypted Text:", encryptedText);
const decryptedText = decryptWithPrivateKey(encryptedText);
console.log("Decrypted Text:", decryptedText);
SHA-256 是 SHA-2 家族中的一员,产生 256 位的散列值。它提供了更高的安全性,并广泛用于许多应用中。
应用: 用于密码存储、数字签名和其他需要强散列算法的场景
const crypto = require("crypto");
// 使用 SHA-256 散列算法
function hash(text) {
const hash = crypto.createHash("sha256");
hash.update(text);
return hash.digest("hex");
}
// 使用示例
const dataToHash = "Hello, World!";
const hashedData = hash(dataToHash);
console.log("Hashed Data:", hashedData);