游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

如何保证API接口安全?

  一、摘要
  在实际的业务开发过程中,我们常常会碰到需要与第三方互联网公司进行技术对接,例如支付宝支付对接、微信支付对接、高德地图查询对接等等服务,如果你是一个创业型互联网,大部分可能都是对接别的公司api接口。
  当你的公司体量上来了时候,这个时候可能有一些公司开始找你进行技术对接了,转变成由你来提供api接口,那这个时候,我们应该如何设计并保证API接口安全呢?二、方案介绍
  最常用的方案,主要有两种:token方案接口签名2。1、token方案
  其中token方案,是一种在web端使用最广的接口鉴权方案,我记得在之前写过一篇《手把手教你,使用JWT实现单点登录》的文章,里面介绍的比较详细,有兴趣的朋友可以看一下,没了解的也没关系,我们在此简单的介绍一下token方案。
  从上图,我们可以很清晰的看到,token方案的实现主要有以下几个步骤:1、用户登录成功之后,服务端会给用户生成一个唯一有效的凭证,这个有效值被称为token2、当用户每次请求其他的业务接口时,需要在请求头部带上token3、服务端接受到客户端业务接口请求时,会验证token的合法性,如果不合法会提示给客户端;如果合法,才会进入业务处理流程。
  在实际使用过程中,当用户登录成功之后,生成的token存放在redis中时是有时效的,一般设置为2个小时,过了2个小时之后会自动失效,这个时候我们就需要重新登录,然后再次获取有效token。
  token方案,是目前业务类型的项目当中使用最广的方案,而且实用性非常高,可以很有效的防止黑客们进行抓包、爬取数据。
  但是token方案也有一些缺点!最明显的就是与第三方公司进行接口对接的时候,当你的接口请求量非常大,这个时候token突然失效了,会有大量的接口请求失败。
  这个我深有体会,我记得在很早的时候,跟一家中、大型互联网公司进行联调的时候,他们提供给我的接口对接方案就是token方案,当时我司的流量高峰期时候,请求他们的接口大量报错,原因就是因为token失效了,当token失效时,我们会调用他们刷新token接口,刷新完成之后,在token失效与重新刷新token这个时间间隔期间,就会出现大量的请求失败的日志,因此在实际API对接过程中,我不推荐大家采用token方案。2。2、接口签名
  接口签名,顾名思义,就是通过一些签名规则对参数进行签名,然后把签名的信息放入请求头部,服务端收到客户端请求之后,同样的只需要按照已定的规则生产对应的签名串与客户端的签名信息进行对比,如果一致,就进入业务处理流程;如果不通过,就提示签名验证失败。
  在接口签名方案中,主要有四个核心参数:1、appid表示应用ID,其中与之匹配的还有appsecret,表示应用密钥,用于数据的签名加密,不同的对接项目分配不同的appid和appsecret,保证数据安全2、timestamp表示时间戳,当请求的时间戳与服务器中的时间戳,差值在5分钟之内,属于有效请求,不在此范围内,属于无效请求3、nonce表示临时流水号,用于防止重复提交验证4、signature表示签名字段,用于判断接口请求是否有效。
  其中签名的生成规则,分两个步骤:第一步:对请求参数进行一次md5加密签名步骤一String参数1请求方式请求URL相对地址请求Body字符串;String参数1加密结果md5(参数1)第二步:对第一步签名结果,再进行一次md5加密签名步骤二String参数2appsecrettimestampnonce参数1加密结果;String参数2加密结果md5(参数2)
  参数2加密结果,就是我们要的最终签名串。
  接口签名方案,尤其是在接口请求量很大的情况下,依然很稳定。
  换句话说,你可以将接口签名看作成对token方案的一种补充。
  但是如果想把接口签名方案,推广到前后端对接,答案是:不适合。
  因为签名计算非常复杂,其次,就是容易泄漏appsecret!
  说了这么多,下面我们就一起来用程序实践一下吧!二、程序实践2。1、token方案
  就像上文所说,token方案重点在于,当用户登录成功之后,我们只需要生成好对应的token,然后将其返回给前端,在下次请求业务接口的时候,需要把token带上。
  具体的实践,也可以分两种:第一种:采用uuid生成token,然后将token存放在redis中,同时设置有效期2哥小时第二种:采用JWT工具来生成token,这种token是可以跨平台的,天然支持分布式,其实本质也是采用时间戳密钥,来生成一个token。
  下面,我们介绍的是第二种实现方式。
  首先,编写一个jwt工具。publicclassJwtTokenUtil{定义token返回头部publicstaticfinalStringAUTHHEADERKEYAuthorization;token前缀publicstaticfinalStringTOKENPREFIXBearer;签名密钥publicstaticfinalStringKEYq3t6w9zCF)JNcQfTjWnZr4u7x;有效期默认为2hourpublicstaticfinalLongEXPIRATIONTIME1000L60602;创建TOKENparamcontentreturnpublicstaticStringcreateToken(Stringcontent){returnTOKENPREFIXJWT。create()。withSubject(content)。withExpiresAt(newDate(System。currentTimeMillis()EXPIRATIONTIME))。sign(Algorithm。HMAC512(KEY));}验证tokenparamtokenpublicstaticStringverifyToken(Stringtoken)throwsException{try{returnJWT。require(Algorithm。HMAC512(KEY))。build()。verify(token。replace(TOKENPREFIX,))。getSubject();}catch(TokenExpiredExceptione){thrownewException(token已失效,请重新登录,e);}catch(JWTVerificationExceptione){thrownewException(token验证失败!,e);}}}
  接着,我们在登录的时候,生成一个token,然后返回给客户端。RequestMapping(valuelogin,methodRequestMethod。POST,produces{applicationjson;charsetUTF8})publicUserVologin(RequestBodyUserDtouserDto,HttpServletResponseresponse){。。。参数合法性验证从数据库获取用户信息UserdbUseruserService。selectByUserNo(userDto。getUserNo);。。。。用户、密码验证创建token,并将token放在响应头UserTokenuserTokennewUserToken();BeanUtils。copyProperties(dbUser,userToken);StringtokenJwtTokenUtil。createToken(JSONObject。toJSONString(userToken));response。setHeader(JwtTokenUtil。AUTHHEADERKEY,token);定义返回结果UserVoresultnewUserVo();BeanUtils。copyProperties(dbUser,result);returnresult;}
  最后,编写一个统一拦截器,用于验证客户端传入的token是否有效。Slf4jpublicclassAuthenticationInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{从http请求头中取出tokenfinalStringtokenrequest。getHeader(JwtTokenUtil。AUTHHEADERKEY);如果不是映射到方法,直接通过if(!(handlerinstanceofHandlerMethod)){returntrue;}如果是方法探测,直接通过if(HttpMethod。OPTIONS。equals(request。getMethod())){response。setStatus(HttpServletResponse。SCOK);returntrue;}如果方法有JwtIgnore注解,直接通过HandlerMethodhandlerMethod(HandlerMethod)handler;MethodmethodhandlerMethod。getMethod();if(method。isAnnotationPresent(JwtIgnore。class)){JwtIgnorejwtIgnoremethod。getAnnotation(JwtIgnore。class);if(jwtIgnore。value()){returntrue;}}LocalAssert。isStringEmpty(token,token为空,鉴权失败!);验证,并获取token内部信息StringuserTokenJwtTokenUtil。verifyToken(token);将token放入本地缓存WebContextUtil。setUserToken(userToken);returntrue;}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{方法结束后,移除缓存的tokenWebContextUtil。removeUserToken();}}
  在生成token的时候,我们可以将一些基本的用户信息,例如用户ID、用户姓名,存入token中,这样当token鉴权通过之后,我们只需要通过解析里面的信息,即可获取对应的用户ID,可以省下去数据库查询一些基本信息的操作。
  同时,使用的过程中,尽量不要存放敏感信息,因为很容易被黑客解析!2。2、接口签名
  同样的思路,站在服务端验证的角度,我们可以先编写一个签名拦截器,验证客户端传入的参数是否合法,只要有一项不合法,就提示错误。
  具体代码实践如下:publicclassSignInterceptorimplementsHandlerInterceptor{AutowiredprivateAppSecretServiceappSecretService;AutowiredprivateRedisUtilredisUtil;OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{appId验证finalStringappIdrequest。getHeader(appid);if(StringUtils。isEmpty(appId)){thrownewCommonException(appid不能为空);}StringappSecretappSecretService。getAppSecretByAppId(appId);if(StringUtils。isEmpty(appSecret)){thrownewCommonException(appid不合法);}时间戳验证finalStringtimestamprequest。getHeader(timestamp);if(StringUtils。isEmpty(timestamp)){thrownewCommonException(timestamp不能为空);}大于5分钟,非法请求longdiffSystem。currentTimeMillis()Long。parseLong(timestamp);if(Math。abs(diff)1000605){thrownewCommonException(timestamp已过期);}临时流水号,防止重复提交finalStringnoncerequest。getHeader(nonce);if(StringUtils。isEmpty(nonce)){thrownewCommonException(nonce不能为空);}验证签名finalStringsignaturerequest。getHeader(signature);if(StringUtils。isEmpty(nonce)){thrownewCommonException(signature不能为空);}finalStringmethodrequest。getMethod();finalStringurlrequest。getRequestURI();finalStringbodyStreamUtils。copyToString(request。getInputStream(),Charset。forName(UTF8));StringsignResultSignUtil。getSignature(method,url,body,timestamp,nonce,appSecret);if(!signature。equals(signResult)){thrownewCommonException(签名验证失败);}检查是否重复请求StringkeyappIdtimestampnonce;if(redisUtil。exist(key)){thrownewCommonException(当前请求正在处理,请不要重复提交);}设置5分钟redisUtil。save(key,signResult,560);request。setAttribute(reidsKey,key);}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{请求处理完毕之后,移除缓存Stringvaluerequest。getAttribute(reidsKey);if(!StringUtils。isEmpty(value)){redisUtil。remove(value);}}}
  签名工具类SignUtil:publicclassSignUtil{签名计算parammethodparamurlparambodyparamtimestampparamnonceparamappSecretreturnpublicstaticStringgetSignature(Stringmethod,Stringurl,Stringbody,Stringtimestamp,Stringnonce,StringappSecret){第一层签名StringrequestStr1methodurlbodyappSecret;StringsignResult1DigestUtils。md5Hex(requestStr1);第二层签名StringrequestStr2appSecrettimestampnoncesignResult1;StringsignResult2DigestUtils。md5Hex(requestStr2);returnsignResult2;}}
  签名计算,可以换成hamc方式进行计算,思路大致一样。三、小结
  上面介绍的token和接口签名方案,对外都可以对提供的接口起到保护作用,防止别人篡改请求,或者模拟请求。
  但是缺少对数据自身的安全保护,即请求的参数和返回的数据都是有可能被别人拦截获取的,而这些数据又是明文的,所以只要被拦截,就能获得相应的业务数据。
  对于这种情况,推荐大家对请求参数和返回参数进行加密处理,例如RSA、AES等加密工具。
  同时,在生产环境,采用https方式进行传输,可以起到很好的安全保护作用!

三星大幅降低GalaxyA235G手机今年出货量目标IT之家12月22日消息,据TheElec报道,三星已经大幅降低其中档智能手机GalaxyA235G今年的出货量目标。原本计划出货1260万部,但现在已经降到400万部以下,降……东北夫妻自驾游5800公里怎么做到没有违章没有事故的自从你有了自己的座驾,那么违章和事故可能是每个有车一族非常关心的事情。我认为人的一生开车没有事故就是成功的标准。我这次从黑龙江齐齐哈尔出发到广州,19天5800公里的路程……华为荣耀新款游戏本将搭载AMD处理器感谢IT之家网友grantchen668的线索投递!IT之家7月13日消息今天,AMD官方发布了一段介绍其SmartShift技术的视频,该技术用于动态分配AMD独显和A……相比初代Zen架构,AMDZen3游戏性能提升达81IT之家12月22日消息AMDRyzen系列处理器于2016年首次亮相,最顶级的R71800X具有8核和16线程设计,但仅有4。1GHz的加速频率。自第一代Zen之后,AMD推……建议家长,多给孩子吃4种高钙食物,不愁长高个儿,赶快安排上导语:建议家长,多给孩子吃4种高钙食物,不愁长高个儿,赶快安排上有了孩子后,家长们都有一个共同的目标,那就是想让孩子长成大高个儿,因为只要个子高,即使相貌平平也很出众,为……开车在无人区遇到狼群了,怎么做才能活下来?躲在车里安全吗?随着生活水平的提高,越来越多的人喜欢上了去旅游,特别是自己开车去自驾游。但是假设如果有人开车去到无人区,遇到狼群了,要怎么做才能够活下来呢?躲在车里又安全吗?或许下面的这……毫无悬念当选状元!山东小伙王岚嵚的CBA首秀打完了!表现如何下场继续加油!赛季首胜!做自己!王岚嵚在打完自己首场CBA正式比赛之后,在社交媒体上写道。今天,同曦男篮打响了新赛季的首场比赛,凭借着00后小将林葳的压哨绝杀,以2……2021GLOMO最佳智能手机奖苹果一加小米三星6款产品获奖IT之家6月30日消息在MWC2021世界通信大会期间,2021GLOMO全球移动大奖今日正式公布。其中,共有6款产品获得最佳智能手机奖,包括苹果iPhone12ProMax,……职考通过率超行业2倍华邦信尔达展现国家高新企业人才实力近日,2022年公路水运工程试验检测职业资格考试成绩放榜,华邦信尔达科技检测有限公司再获佳绩,47名员工通过考试,通过率达30,为行业平均通过率的2倍;连续6年平均通过率为29……999美元Vuzix开始销售AR智能眼镜IT之家1月3日消息据外媒TheVerge的新闻,在消费电子行业最大的年度贸易展CES上,数十种产品会不断宣传和推出,这种现象只有在出货时或在明年的展会上展示新版本时才会消失。……赠网易云音乐黑胶会员1年葫芦宝卡畅听卡年卡89元大促葫芦宝卡畅听卡年卡原价238元,今日券后仅需89元,4折大促探底好价。限时再送网易云音乐黑胶会员月卡12张(需每月领取):天猫葫芦宝卡畅听卡年卡含网易云音乐12个月需自行……微软XboxSeriesS测试辐射4可60fps运行IT之家10月13日消息根据Xbox官方的消息,《辐射4》可在XboxSeriesS上60fps运行,达到了XboxOne上的两倍帧率。IT之家了解到,《辐射4》(Fal……
阿里豪掷84亿盘下新加坡第一高楼,支付宝女王彭蕾也悄然移民于大望财讯文阿里与新加坡,最近成了两个关系紧密的关键词。一方面,阿里巴巴将在2028年建成新加坡第一高楼;另一方面,作为阿里创始人、有支付宝女王之称的彭蕾,也在最近被……EDG夺冠为什么会引发这么大轰动11月7号凌晨,EDG与DK鏖战到第五局,终于是在最后的决胜局打败了DK夺得了冠军,这也是LPL队伍第一次在世界赛决赛击败LCK队伍夺冠。首先EDG夺冠,为什么说含金量是……拒绝绿军加盟火箭,斯通捡漏三分神射手,赛拉斯这下该高兴了距离火箭队的揭幕战就剩下两天时间了,不过球队的管理层依然没有停止对球队阵容进行调整,这不就在昨天夜里,斯通又连续完成了几笔操作,球队先是裁掉双向合同球员安东尼兰姆,然后签下了穆……离婚后,董璇自曝追求者都是弟弟我要体会萧亚轩的快乐01hr从没见过,这样的董璇!最新一期《五十公里桃花坞》里,宋丹丹跟女生们聊择偶。董璇表示:能跟我谈恋爱这个年龄段的男孩,要不就有家有女朋友,要么就是孟子义抢……赵睿深夜怒骂球迷错了吗?三点非常不妥但有些球迷的确太过分大家好,我是183蒙面男子。2022年亚洲杯拉开帷幕,在首场比赛中,中国队输给了韩国队。关于本场比赛的一些分析,我已经在昨天的节目中聊过了,这期不多说。但是,在首场比赛结束之后……德尔塔克戎(deltacron)变异株XAY。2又是什么?财经新势力新春季多国检出德尔塔克戎变异株多国检出德尔塔克戎(deltacron)变异株,泰国在新冠病例中检测出德尔塔克戎XAY。2毒株、从而调整了入境政策,这个变异株是什……Epic喜1模拟经营后患无穷下周送小兵大战Epic喜加一今日继续,本周送出模拟游戏《RecipeforDisaster(后患无穷)》,下周送出《小兵大战》。领取地址:《RecipeforDisaster(后……美国拳击冠军与志愿军肉搏后退出拳坛,晚年仍后怕活着已是幸运托伊罗根是美国历史上一位有名的拳击冠军,曾经是打败天下无敌手的常胜将军,但他在晚年时回忆自己的一生时,却感叹道:能够活着就已经是幸运了。这位曾经令人闻风丧胆的拳坛霸主,从……中国电竞发展史你知道吗?传承永不磨灭电子竞技,记录了无数人的青春回忆,在这里他们留下了难以磨灭的快乐、痛苦。如今,电子竞技紧随时代的发展,各类赛事层出不穷,市场规模空前巨大,正在一步步走向繁荣。然而,纵观我国电竞……火箭更衣室失控,塞拉斯已经失去对球员的掌控,火箭将何去何从?本赛季的摆烂球队本来有六支球队,火箭、马刺、雷霆、活塞、黄蜂、魔术。但随着赛季的持续,魔术和雷霆已经开始展现出了潜力,天赋都开始兑现,战绩也同时得到提升,那么最有望争夺状元签的……区域一体化江苏三地签署大茅山旅游发展战略合作协议3月26日,第十三届中国句容茅山文化旅游节暨2023镇江乡村文化旅游年启动仪式在句容茅山风景区举行。本文图片均来自句容市委宣传部3月26日,第十三届中国句容茅山文化旅游节……智慧景区多业态双中台功能新增,新功能上线啦景区通多业态双中台功能新增近期,巨有科技多业态双中台在景区展示页面、景区后台管理方面进行了进一步优化,上线了一些好用又方便的新功能,希望能给景区管理者和涉旅企业带来便捷高……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网