在以SpringBoot开发后台API接口时,会存在哪些接口不安全的因素呢?通常如何去解决的呢?,SpringBoot接口 – API接口有哪些不安全的因素?如何对接口进行签名?,建议从接口整体的安全体系角度来理解,比如存在哪些不安全的因素,加密解密等知识点。,这里从体系角度,简单列举一些不安全的因素:,是不是一个合法的开发者?,是不是一个合法的客户端?,是不是一个合法的用户?,有没有权限访问接口?,http明文传输数据?,接口重放,上文介绍的接口幂等,接口超时,加timestamp控制?,…,针对上述接口存在的不安全因素,这里向你展示一些典型的保障接口安全的方式。,这种设计一般用在开发接口的安全,以确保是一个 合法的开发者 。,以阿里云相关产品为例,,从两个视角去看,典型的是AppKey&AppSecret,或者ClientId&ClientSecret等,比如oauth2协议的client cridential模式,grant_type参数等于client_credentials表示client credentials方式,client_id是客户端id,client_secret是客户端密钥。,返回token后,通过token访问其它接口。,比如oauth2协议的授权码模式(authorization code)和密码模式(resource owner password credentials),grant_type参数等于password表示密码方式,client_id是客户端id,username是用户名,password是密码。,(PS:password模式只有在授权码模式(authorization code)不可用时才会采用,这里只是举个例子而已),可选参数scope表示申请的权限范围。(相关开发框架可以参考spring security, Apache Shiro, SA-Token 等),从接口传输安全的角度,防止接口数据明文传输, 具体可以看 这里,HTTP 有以下安全性问题:,HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPs 使用了隧道进行通信。,通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。,,接口签名(加密),主要防止请求参数被篡改。特别是安全要求比较高的接口,比如支付领域的接口。,首先我们需要分配给客户端一个私钥用于URL签名加密,一般的签名算法如下:,例如:,https://api.xxxx.com/token?key=value&timetamp=xxxx&sign=xxxx-xxx-xxx-xxxx,服务器端接收到请求后,用同样的算法获得服务器的sign,对比客户端的sign是否一致,如果一致请求有效;如果不一致返回指定的错误信息。,一般涉及这块,主要包含三点:密钥,签名算法,签名规则,PS:有读者会问,我们是可能从有些客户端获取密钥,算法和规则的(比如前端SPA单页应用生成的js中获取密钥,算法和规则),那么签名的意义在哪里?我认为签名是手段而不是目的,签名是加大攻击者攻击难度的一种手段,至少是可以抵挡大部分简单的攻击的,再加上其它防范方式(流水号,时间戳,token等)进一步提升攻击的难度而已。,严格来说不是一回事:,签名可以放在请求参数中(path中,body中等),更为优雅的可以放在HEADER中,比如X-Sign(通常第三方的header参数以X-开头),以腾讯开放平台为例,请参考 腾讯开放平台第三方应用签名参数sig的说明,本例子采用AOP拦截自定义注解方式实现,主要看实现的思路而已(签名的目的要防止参数被篡改,就要对可能被篡改的参数签名)。@pdai,这里可以看到需要对所有用户可能修改的参数点进行按规则签名,注册,body参数,,如果不带X-SIGN,,如果X-SIGN错误,,如果X-SIGN正确,,https://github.com/realpdai/tech-pdai-spring-demos
© 版权声明
文章版权归作者所有,未经允许请勿转载。