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

创建网站目录时我们应该百度一下百度网页官

创建网站目录时我们应该,百度一下百度网页官,徐州建设工程公共资源交易平台,博客可以做网站收录用的吗需求场景 由于项目需要开发第三方接口给多个供应商,为保证Api接口的安全性,遂采用Api接口签名验证。 Api接口签名验证主要防御措施为以下几个: 请求发起时间得在限制范围内请求的用户是否真实存在是否存在重复请求请求参数是否被篡改 项目…

需求场景

由于项目需要开发第三方接口给多个供应商,为保证Api接口的安全性,遂采用Api接口签名验证。

Api接口签名验证主要防御措施为以下几个:

  • 请求发起时间得在限制范围内
  • 请求的用户是否真实存在
  • 是否存在重复请求
  • 请求参数是否被篡改

项目路径

https://gitee.com/charles_ruan/easy-sign

代码实现

不同的客户端有着不同的appSecret

  • 通过密钥可以为不同的客户端(调用方) 分配不同的appSecret,来区分不同客户端app(调用方)。
  • 将获取到的appSecret 参与到sign(签名)的生成,保证了客户端的请求签名是由我们后台控制的。

定义切面,拦截带SignatureValidation方法。

  • 获取方法上的参数,存入SortedMap
  • 判断参数是否合法
    • 判断appId是否存在对应的secret
    • 判断时间戳是否有效
  • 进行签名校验
@Slf4j
@Aspect
public class SignAspect {@Before("@annotation(signatureValidation)")public void doBefore(SignatureValidation signatureValidation) throws Throwable {// 接收到请求,记录请求内容HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();SortedMap<String, String> allParams = HttpUtils.getAllParams(request);// 1、获取请求sign签名参数,String sign = allParams.get("sign");if (StrUtil.isBlank(sign)) {throw new RuntimeException("sign不能为空");}// 2、获取请求参数secretString appId = allParams.get("appId");String appSecret = getAppSecret(appId);if (StrUtil.isBlank(appSecret)) {throw new RuntimeException("appId不合法");}// 3、获取请求参数timestamp 时间戳,String timestamp = allParams.get("timestamp");if (StrUtil.isBlank(timestamp)) {throw new RuntimeException("timestamp不能为空");}//3. 比较时间,120s内为合法请求if (Math.abs(Long.parseLong(timestamp) - System.currentTimeMillis()) > 120000) {throw new RuntimeException("timestamp失效");}allParams.put("secret", appSecret);verifySign(allParams);}private void verifySign(SortedMap<String, String> allParams) {// 对方签名String sign = allParams.get("sign");allParams.remove("sign");String mySign = SecureUtil.md5(JSONUtil.toJsonStr(allParams)).toUpperCase();log.info("验签,对方签名:{},我方签名:{}", sign, mySign);// 验签Assert.isTrue(StrUtil.equals(sign, mySign), "验签失败");}public String getAppSecret(String appId) {Map<String, String> map = new HashMap<>();map.put("zs001", "asd123fhg3b7fgh7dfg");map.put("ls001", "hghfgh123btgfyh1212");return map.get(appId);}
}

利用nonce参数,可以防止重复提交,在签名验证成功后,判断是否重复提交,原理就是结合redis,判断是否已经提交过

    public boolean isReplayAttack(String appId, String timeStamp, String nonce, String signature) {StringBuilder redisKey = new StringBuilder();redisKey.append("IS_REPLAY_ATTACK").append(":").append(Constant.APP_ID).append(":").append(appId).append(Constant.TIME_STAMP).append(":").append(timeStamp).append(Constant.NONCE).append(":").append(nonce).append(Constant.SIGN).append(":").append(signature);Object value = redisTemplate.opsForValue().get(redisKey);if (value != null && StringUtils.equals(signature, value.toString()))return false;elseredisTemplate.opsForValue().set(redisKey, signature, 1000 * 50);return false;}
标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符

在这里插入图片描述

http://www.hyszgw.com/news/617.html

相关文章:

  • 宜兴建设局质监网站关键词排名点击
  • 网页设计html和css作业源代码百度 seo 工具
  • php网站模块修改最好的网站设计公司
  • 做网站页面怎么做百度一下免费下载安装
  • 如何自己建设电影网站代码优化
  • 建设网站赚钱百度下载安装2021最新版
  • 虚拟主机的网站怎么做日志留存优秀软文范例800字
  • 广广东网站建设谷歌浏览器安卓版下载
  • 如何注册网站名称百度下载安装最新版
  • 网站建设jiage互联网营销培训平台
  • wordpress给tag增加字段seo的内容怎么优化
  • 各位给推荐个成人网站小说关键词搜索器
  • 一般网站建设公司好推广信息哪个平台好
  • 祥符网站建设免费网络空间搜索引擎
  • 网站seo诊断书新冠疫情最新情况最新消息
  • 如何做网站地图seox
  • dedecms网站地图生成网络游戏推广
  • 学做网站开发广州官方新闻
  • 南昌设计政府网站的公司百度关键词推广方案
  • 网页制作网站开发流程百度手机助手下载安卓版
  • 有用的网站地址东莞网站优化公司
  • 网站开发上海兔子bt搜索
  • 四川做网站多少钱营销渠道的三个类型
  • 免费的招聘网站有哪些杭州seo排名
  • 上海网站建设怎么黄页88网
  • 自己搭建的ftp怎么做网站营销网站建设
  • hbuilder 做网站荥阳网络推广公司
  • 南宁做棋牌网站的公司企业网站推广技巧
  • 网站的建设要多少钱苏州seo
  • 介绍湛江网站网络公司