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

威海市建设局官方网站营销型网站建设优化建站

威海市建设局官方网站,营销型网站建设优化建站,安陆做网站多少钱,php mysql网站开发试题a需求场景 由于项目需要开发第三方接口给多个供应商,为保证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.wangmingla.cn/news/144556.html

相关文章:

  • 做网站必须要加v吗石家庄seo扣费
  • 如何做付费视频网站百度智能小程序怎么优化排名
  • 校园网站建设的要素模板式自助建站
  • 河南网站建设公司网络营销成功案例介绍
  • 外地公司做的网站能备案国际最新十大新闻事件
  • 网站开发员工资淘宝怎么设置关键词搜索
  • 西安可以做网站的百度快照替代
  • 做垃圾站采集国外网站百度风云榜游戏
  • 网站排名软件网址深圳百度推广关键词推广
  • 免费虚拟主机控制面板网奇seo培训官网
  • 网站建设方案及报价有什么公司要做推广的
  • 不上此网站枉做男人网页制作用什么软件做
  • 上海营销网站建设定制服务福州今日头条新闻
  • 成都网站建设有限公司百度客户端登录
  • sem与seo的区别网站权重优化
  • 怎么做一个链接网站网络营销事件
  • 网站建设后台管理百度贴吧网页版登录入口
  • 做网站如何下载别人网站图片上海网络优化seo
  • 深圳建筑设计平台网站长春百度网站快速排名
  • 网站锚点域名查询大全
  • 关系的网站杭州网站建设方案优化
  • 酒泉市城乡建设局网站百度品牌广告
  • 大鹏网站建设公司北京百度推广优化排名
  • 网站支付体现功能怎么做网络营销的方式有几种
  • 培训类网站开发常宁seo外包
  • wordpress获取用户注册时间seo优化方向
  • 网站建设服装在线商城实训报告网站是如何建立的
  • 为公司建立网站企业网站设计思路
  • 合肥市中小企业局网站低价刷赞网站推广
  • 企业网站制作前期需要什么资料软件开发网