当前位置: 首页 > news >正文

时间戳 + 签名机制

对于无需登录的门户网站接口,既要避免固定 token 被滥用,又要实现动态鉴权,同时不影响用户体验(无需强制登录),可以采用以下几种鉴权方案,结合 “动态可变” 和 “轻量化” 特点设计:

一、时间戳 + 签名机制(推荐)

核心思路

客户端每次请求时,基于当前时间戳请求参数双方约定的密钥生成一个动态签名,服务端验证签名合法性和时间戳有效性(防止重放攻击)。
签名每次请求都不同(因时间戳变化),且无法伪造(依赖密钥),无需登录即可实现动态鉴权。

实现步骤
  1. 客户端生成请求参数

    • 固定参数:timestamp(当前时间戳,精确到秒,如 1620000000)、nonce(随机字符串,如 UUID,防止重复请求)。
    • 业务参数:接口所需的实际数据(如 page=1&size=10)。
    • 签名生成:将 timestamp + nonce + 业务参数(排序后)+ 密钥 拼接成字符串,通过 MD5 或 SHA256 加密生成 sign

    示例拼接规则(按参数名 ASCII 排序,避免顺序影响签名):
    key=密钥&nonce=xxx&page=1&size=10&timestamp=1620000000 → 加密后得到 sign

  2. 客户端请求
    将 timestampnoncesign 作为请求头(或参数)发送,例如:

    http

    GET /api/portal/data HTTP/1.1
    timestamp: 1620000000
    nonce: 5f4dcc3b5aa765d61d8327deb882cf99
    sign: a1b2c3d4e5f6...
    
  3. 服务端验证

    • 验证 timestamp 是否在有效时间窗口内(如 ±5 分钟,防止过期请求被重放)。
    • 验证 nonce 是否重复(可暂存最近 5 分钟的 nonce 到缓存,防止重复使用)。
    • 按客户端相同规则重新计算 sign,与请求中的 sign 比对,一致则通过。
优势
  • 签名动态变化(依赖时间戳和随机数),无法复用。
  • 无需登录,不影响用户体验。
  • 防重放(时间戳 + nonce)、防篡改(签名验证)。
注意
  • 密钥需在客户端(前端)加密存储(如通过混淆、环境变量注入),避免明文暴露。
  • 采用 HTTPS 传输,防止参数被中间人截取。

以下是基于 “时间戳 + 签名机制” 的完整实现,包括后端拦截器和前端 JS 请求示例,确保前后端签名逻辑一致。

一、后端拦截器实现(Spring Boot)

1. 签名工具类(核心,用于生成和验证签名)

java

import org.springframework.util.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.util.*;/*** 签名工具类:生成签名和验证签名*/
public class SignUtil {// 密钥(实际项目中放在配置文件,前后端保持一致)public static final String SECRET_KEY = "your_portal_secret_key"; // 建议通过配置注入/*** 生成签名* @param method 请求方法(GET/POST等)* @param url 请求路径(如/api/data)* @param params 请求参数(Query参数或Body参数)* @param timestamp 时间戳(秒)* @param nonce 随机字符串* @return 签名串(SHA256加密)*/public static String generateSign(String method, String url, Map<String, Object> params, long timestamp, String nonce) {// 1. 拼接参数:按参数名ASCII排序,避免顺序影响签名TreeMap<String, Object> sortedParams = new TreeMap<>(params);StringBuilder paramStr = new StringBuilder();sortedParams.forEach((k, v) -> paramStr.append(k).append("=").append(v).append("&"));if (paramStr.length() > 0) {paramStr.deleteCharAt(paramStr.length() - 1); // 移除最后一个&}// 2. 拼接签名源串:method + url + params + timestamp + nonce + secretString source = String.format("%s%s%s%d%s%s",method.toUpperCase(),url,paramStr,timestamp,
http://www.lryc.cn/news/606336.html

相关文章:

  • 学习日志23 python
  • 因为想开发新项目了~~要给老Python项目整个虚拟环境
  • HTML基础复习:全面回顾核心概念
  • 谷歌V3插件热更新
  • 【0基础PS】Photoshop (PS) 理论知识
  • 【刷题】东方博宜oj 1412-快速幂(零基础,简单易懂)
  • Mysql-视图,函数,存储过程,触发器
  • 【Kiro Code】Chat 聊天功能
  • 某讯视频风控参数逆向分析
  • Docker部署的PostgreSQL慢查询日志配置指南
  • pytorch的自定义 CUDA 扩展怎么学习
  • pytorch程序语句固定开销分析
  • 排序算法-选择排序(选择排序、堆排序)(动图演示)
  • Next实习项目总结串联讲解(一)
  • 基于京东评论的文本挖掘与分析,使用LSTM情感分析算法以及网络语义分析
  • 正则化都是放在模型的哪个位置呢?
  • 案例开发 - 日程管理 - 第四期
  • 【C语言学习】scanf函数
  • 【源力觉醒 创作者计划】文心一言与deepseek集成springboot开发哪个更方便
  • 3.Linux 系统文件类型与文件权限
  • AI与AGI:从狭义智能到通用智能
  • 上证50期权2400是什么意思?
  • 性能测试篇 :Jmeter监控服务器性能
  • virtualbox+UBuntu20.04+内存磁盘扩容
  • 知识随记-----使用现代C++客户端库redis-plus-plus实现redis池缓解高并发
  • 逻辑回归的应用
  • JVM学习日记(十二)Day12
  • 8K、AI、低空智联,H.266能否撑起下一代视频通路?
  • vue 开发总结:从安装到第一个交互页面-与数据库API
  • 逻辑回归详解:从数学原理到实际应用