You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发送固定报文时HTTPS是否安全?树莓派门禁请求如何防重放仿冒

问题解答

关于HTTPS防重放的误区解答

HTTPS本身仅在传输会话层提供基础的防重放能力,并不覆盖应用层请求的重放防护,你对风险的判断是正确的:

  1. 若你的HTTPS配置完全合规(未泄露证书私钥、客户端不接受无效证书、无中间人植入可信根证书),攻击者无法截获请求明文内容,也无法重放加密后的请求报文——HTTPS的会话密钥是单次随机协商的,加密报文仅在当前会话有效,重放到其他会话服务端无法正常解密。
  2. 但若HTTPS配置存在漏洞,或者请求明文通过其他途径泄露(比如客户端日志泄露、设备被入侵),固定内容的请求哪怕带了固定账号密码,都可以被攻击者直接重放触发开门。

可行的身份验证与防重放方案

推荐使用预共享密钥+时效签名的方案,实现成本极低、安全性足够满足你的需求,密钥全程不会在网络中传输:

  1. 你的发请求端和树莓派两端预先存储一个只有双方知道的复杂密钥SECRET_KEY,不要在任何网络请求中携带该密钥。
  2. 发请求时客户端生成三个额外参数:
    • timestamp:当前Unix时间戳,精确到秒
    • nonce:长度10位以上的随机字符串,避免同一秒生成的请求签名重复
    • sign:将task + timestamp + nonce + SECRET_KEY拼接后做SHA256哈希得到的签名值
  3. 最终请求体格式如下:
{
    "task": "open",
    "timestamp": 1718000000,
    "nonce": "a8d7f9e2c1b3",
    "sign": "生成的SHA256哈希值"
}
  1. 树莓派收到请求后按以下步骤验证,任意一步不通过直接拒绝请求:
    • 校验时间戳与树莓派当前时间差不超过5分钟(可自行调整为更短的有效期,比如1分钟),过期直接拒绝,避免历史请求被重放
    • 存储最近5分钟内已经验证通过的nonce值,若收到的nonce已经存在直接拒绝,避免同一时间的请求被重复重放
    • 用收到的task、timestamp、nonce和本地存储的SECRET_KEY按同样规则计算签名,和请求携带的sign对比,不一致直接拒绝

Node.js 实现示例

客户端生成请求代码

const crypto = require('crypto');
// 密钥存在环境变量中,不要硬编码
const SECRET_KEY = process.env.OPEN_DOOR_SECRET;

function generateOpenParams() {
  const timestamp = Math.floor(Date.now() / 1000);
  const nonce = crypto.randomBytes(8).toString('hex');
  const task = 'open';
  const sign = crypto.createHash('sha256')
    .update(`${task}${timestamp}${nonce}${SECRET_KEY}`)
    .digest('hex');
  return { task, timestamp, nonce, sign };
}

树莓派端验证代码

const crypto = require('crypto');
const SECRET_KEY = process.env.OPEN_DOOR_SECRET;
// 存储已使用的nonce,5分钟自动清空一次
const usedNonces = new Set();
setInterval(() => usedNonces.clear(), 5 * 60 * 1000);

function verifyRequest(body) {
  const { task, timestamp, nonce, sign } = body;
  // 校验参数完整性
  if (!task || !timestamp || !nonce || !sign) return false;
  // 校验时间有效性
  const now = Math.floor(Date.now() / 1000);
  if (Math.abs(now - timestamp) > 5 * 60) return false;
  // 校验nonce是否重复
  if (usedNonces.has(nonce)) return false;
  // 校验签名
  const calculatedSign = crypto.createHash('sha256')
    .update(`${task}${timestamp}${nonce}${SECRET_KEY}`)
    .digest('hex');
  if (calculatedSign !== sign) return false;
  // 验证通过,记录nonce
  usedNonces.add(nonce);
  return true;
}

额外安全优化建议

  • 停止使用80端口的HTTP服务,改为监听443端口启用HTTPS,所有80端口的请求自动跳转HTTPS,避免明文传输。
  • 若发起请求的设备公网IP固定,可以在树莓派防火墙配置IP白名单,仅允许白名单IP访问服务端口,从网络层拦截非法请求。
  • 配置接口频率限制,单IP1分钟内最多请求3次,避免暴力破解尝试。

内容的提问来源于stack exchange,提问作者Moritz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:18:03