sign.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. <?php
  2. /**
  3. * 接口签名(防篡改 / 防重放)配置
  4. *
  5. * 签名串格式:
  6. * {METHOD}|{PATH}|{X-Time}|{X-Nonce}|d-token={d-token}
  7. * 示例:
  8. * POST|/api/anime/detail|1737280000|a1b2c3d4e5|d-token=3f2a...
  9. *
  10. * 签名算法:HMAC-SHA256(签名串, SIGN_SALT)(输出小写 hex,64 位)
  11. * 请求头 :X-Time / X-Nonce / X-Sign
  12. *
  13. * 注意:salt 会下发到前端,因此它不是真正的秘密。该签名的价值在于
  14. * 防参数篡改、防重放(配合 nonce 去重与时间窗)以及抬高脚本调用门槛,
  15. * 接口的最终权限仍由 token 鉴权与资源归属校验保证。
  16. */
  17. return [
  18. // 总开关(对应 .env 中的 CHECK_SIGN)
  19. 'enabled' => (bool)env('CHECK_SIGN', false),
  20. // 签名盐
  21. 'salt' => (string)env('SIGN_SALT', '352bb5074767ca21fb7204bf47e5dba5fb4302a322d62308da6c7a06badd18d9'),
  22. // 时间窗(秒):请求时间与本机时间的最大允许偏差
  23. 'ttl' => (int)env('SIGN_TTL', 180),
  24. // 是否对 nonce 去重(防重放):同一 nonce 在时间窗内只允许使用一次,依赖 Redis
  25. 'nonce_unique' => (bool)env('SIGN_NONCE_UNIQUE', true),
  26. /*
  27. | 免验签白名单:命中的用户 / 公司跳过验签(用于内部账号灰度或线上排障)
  28. | 多个用逗号分隔,例如 SIGN_SKIP_UIDS=1,2 SIGN_SKIP_CPIDS=1
  29. | 留空表示不跳过任何账号
  30. */
  31. 'skip_uids' => array_values(array_filter(array_map('intval', explode(',', (string)env('SIGN_SKIP_UIDS', ''))))),
  32. 'skip_cpids' => array_values(array_filter(array_map('intval', explode(',', (string)env('SIGN_SKIP_CPIDS', ''))))),
  33. // 签名算法(hash_hmac 支持的算法)
  34. 'algo' => (string)env('SIGN_ALGO', 'sha256'),
  35. ];