安全架构

问题

  1. 使用api网关过滤器对防止xss、sql注入问题

<script>alert(‘ss’)</script> or 1=1

  1. 对我们的接口实现对称加密,抓包的时候看不到明文的数据,但是可以被破解,因为客户端与服务器都是采用同一个密钥实现加解密,可以通过反编译客户端代码得出密钥实现破解。 Des、aes

  2. 使用非对称加密RSA 公钥和私钥互换机制,客户端使用公钥实现加密,服务器端采用私钥实现解密,就算黑客破解出公钥也无法对数据实现解密。

一对密钥 两个密钥 公钥 和私

对称加解密速度比rsa要快,但是不安全。

  1. 可以采用MD5对我们的参数实现验证签名,但是数据还是传输明文,可以防止

篡改数据。

  1. 互联网电商项目都会采用Https协议 ssl+证书 加密传输 默认443 而我们的Http协议采用明文实现对数据传输,效率比较Https要高,但是不安全。

  2. 对我们的api接口实现黑名单和白名单控制

  3. 对我们接口实现服务保护、限流、熔断

  4. 使用图形验证码防止机器模拟请求

  5. 对我们代码使用专门扫描工具实现检测漏洞

  6. 在rpc传递参数过程中使用令牌隐藏真实的参数。

  7. 数据库表权限框架设计

如何防御xss攻击

xss脚本攻击:提交的参数带入js脚本,转发到页面执行

http://127.0.0.1:8080/getUserInfo?userName=<script type="text/javascript">
  window.location.href="http://www.mayikt.com";
</script>

用户提交<script>的时候进行转义

过滤器转义

@Component
@WebFilter
public class XssFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request);
        chain.doFilter(xssHttpServletRequestWrapper, response);
    }


    @Override
    public void destroy() {

    }
}

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
        String oldValue = super.getParameter(name);
        if(StringUtils.isEmpty(oldValue)){
            return oldValue;
        }
        String newValue = StringEscapeUtils.escapeHtml4(oldValue);
        return newValue;
    }
    
}

如何防止抓包篡改数据

可以使用第三方抓包工具,对请求前后实现代理,可以修改参数请求内容和参数响应内容。

请求的时候加上md5签名,请求数据+加盐 加密,后端也加密,看看有没有变化

加密

对称加密

  1. 加密和解密都是同一个秘钥

  2. 优势:算法公开、加密快、效率高。

  3. 缺点:可以采用反编译破解客户端真实秘钥

常用对称加密框架:

1.DES****(Data Encryption Standard****)

2.3DES****(DES****加强版,使用3****次DES****计算,Triple DES****,DESede****)

3.AES****(Advanced Encryption Standard****,3DES****加强版)

加密与解密都是采用同一个秘钥,也就是客户端与服务器数据传输采用同一个秘钥实现

加解密,所以如果黑客反编译了客户端源代码就可以破解该密文。

对称加密算法: des、aes

非对称加密

公钥和私钥互换,生成一对秘钥对,分别为公钥和私钥。

  1. 公钥加密,必须私钥解密

  2. 私钥加密,必须公钥解密

所以在很多支付接口中为了保证安全性,客户端采用公钥加密,服务器端采用私钥解密,就算别人客户端的公钥,也无法解密,因为解密数据必须要私钥,而私钥存放在服务器端。

最为著名的就是RSA

UrlEncode编码/UrlDecode解码

https://tool.chinaz.com/tools/urlencode.aspx

在Http协议通讯过程中,如果传递特殊字符的情况下,比如:+!等特殊字符统一会变为空格。

所以注意需要对url参数实现UrlEncode

https://baike.baidu.com/item/urlencode/8317412?fr=aladdin

Java后端Api实现 UrlEncode与UrlDecode、

String encode = URLEncoder.encode("mayi+kt", "UTF-8");
System.out.println(encode);
String decode = URLDecoder.decode(encode, "UTF-8");
System.out.println(decode);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容