
前后端数据加密传输完整方案:从理论到实战
在实际项目中,我经常遇到数据在传输过程中被窃取或篡改的安全问题。今天就来分享一套经过多个项目验证的前后端数据加密传输方案,包含具体的实现步骤和代码示例。
一、方案设计思路
我们采用非对称加密+对称加密的混合加密方案:
- 使用 RSA 非对称加密传输 AES 密钥
- 使用 AES 对称加密传输业务数据
- 加入时间戳和签名防止重放攻击
二、前端加密实现
首先在前端安装必要的加密库:
npm install crypto-js jsencrypt
前端加密核心代码:
import JSEncrypt from 'jsencrypt'
import CryptoJS from 'crypto-js'
// 生成 AES 密钥和初始化向量
const aesKey = CryptoJS.lib.WordArray.random(32)
const iv = CryptoJS.lib.WordArray.random(16)
// 使用 RSA 公钥加密 AES 密钥
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey)
const encryptedAesKey = encryptor.encrypt(aesKey.toString())
// AES 加密数据
const encryptData = (data) => {
const encrypted = CryptoJS.AES.encrypt(
JSON.stringify(data),
aesKey,
{ iv: iv }
)
return encrypted.toString()
}
// 发送加密请求
const sendEncryptedData = async (data) => {
const encryptedData = encryptData(data)
const payload = {
key: encryptedAesKey,
data: encryptedData,
iv: iv.toString(),
timestamp: Date.now(),
signature: generateSignature(data)
}
return await fetch('/api/secure-endpoint', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
})
}
三、后端解密实现
后端使用 Node.js + Express 示例:
const crypto = require('crypto')
const NodeRSA = require('node-rsa')
// RSA 私钥解密 AES 密钥
const decryptAesKey = (encryptedKey) => {
const key = new NodeRSA(privateKey)
return key.decrypt(encryptedKey, 'utf8')
}
// AES 解密数据
const decryptData = (encryptedData, aesKey, iv) => {
const decipher = crypto.createDecipheriv('aes-256-cbc',
Buffer.from(aesKey, 'hex'),
Buffer.from(iv, 'hex'))
let decrypted = decipher.update(encryptedData, 'base64', 'utf8')
decrypted += decipher.final('utf8')
return JSON.parse(decrypted)
}
// 验证签名和时效性
const verifyRequest = (payload) => {
const { timestamp, signature } = payload
// 检查时间戳,防止重放攻击
if (Date.now() - timestamp > 300000) {
throw new Error('请求已过期')
}
// 验证签名
if (!verifySignature(payload)) {
throw new Error('签名验证失败')
}
}
app.post('/api/secure-endpoint', (req, res) => {
try {
const { key, data, iv, timestamp, signature } = req.body
verifyRequest(req.body)
const aesKey = decryptAesKey(key)
const decryptedData = decryptData(data, aesKey, iv)
// 处理业务逻辑
console.log('解密后的数据:', decryptedData)
res.json({ success: true, message: '处理成功' })
} catch (error) {
console.error('解密失败:', error)
res.status(400).json({ success: false, message: error.message })
}
})
四、实战踩坑经验
在实施过程中,我遇到了几个典型问题:
- 密钥管理:RSA 密钥对需要安全存储,建议使用环境变量或密钥管理服务
- 性能优化:RSA 加密较慢,只用于加密 AES 密钥,避免加密大量数据
- 编码问题:注意前后端编码一致性,建议统一使用 Base64 编码
- 时间同步:确保前后端时间同步,时间窗口建议设置为 5 分钟
五、安全增强建议
根据实际项目经验,我建议:
- 定期更换 RSA 密钥对,建议每月更换一次
- 在前端使用 Web Crypto API 替代第三方库以获得更好性能
- 加入请求频率限制,防止暴力破解
- 使用 HTTPS 作为传输层安全保障
这套方案在我负责的多个金融级项目中运行稳定,有效防止了中间人攻击和数据泄露。希望这个实战经验对你有帮助!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
源码库 » 前后端数据加密传输完整方案
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
源码库 » 前后端数据加密传输完整方案
