最新公告
  • 欢迎您光临源码库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入
  • 前后端数据加密传输完整方案

    前后端数据加密传输完整方案插图

    前后端数据加密传输完整方案:从理论到实战

    在实际项目中,我经常遇到数据在传输过程中被窃取或篡改的安全问题。今天就来分享一套经过多个项目验证的前后端数据加密传输方案,包含具体的实现步骤和代码示例。

    一、方案设计思路

    我们采用非对称加密+对称加密的混合加密方案:

    • 使用 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. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

    源码库 » 前后端数据加密传输完整方案