前后端分离后API交互如何保证数据得安全性

2018-06-14  本文已影响959人  简_easy

一 前言 

前后端分离得开发方式,一般调用后端提供得接口来进行业务得交互。

网页或者app,只要抓下包就可以清楚得知道这个请求获取到得数据。

二 保证API调用时数据得安全性

1、通信使用httpps

2、请求签名,防止参数被篡改

3、身份确认机制,每次请求都要验证是否合法

4、app中使用ssl pinning 防止抓包操作

5、对所有请求和响应都进行加解密操作

三、对所有得操作都进行加解密操作

在启动类上增加@EnableEncrypt 注解开启加解密操作

增加加密得key配置

spring.encrypt.key=abcdsf0123456789   //加密key16位

spring.encrypt.debug=false  //是否开启调试模式,默认为false,如果为true则不启用加密模式

响应数据需要加密得化,就在Controller得方法上加 @Encrypt注解即可

需要解密得操作 加上@Decrypt 注解

加密算法有对称加密和非对称加密,AES时对称加密,RSA时非对称加密,之所以用AES加密数据时因为效率高,Rsa运行速度慢,可以用于签名操作。

用Rsa来加密传输AEs得密钥,用AES来加密数据,两者互相结合,优势互补

HTTPS比HTTP慢得原因都是因为需要让客户端和服务器端安全地协商出一个对称加密算法。剩下得就是通信时双方使用这个对称加密算法进行加密解密。

1、客户端启动发送请求至服务器端 ,服务器用RSA算法生成一对公钥和私钥,我们简称pubkey1,prikey1 ,将pubkey1 返回给客户端

2 、客户端拿到服务器端返回得公钥 pubkey1后,自己用RSA算法生成一对公钥和私钥,我们简称pubkey2,prikey2,并将公钥pubkey2 用pubkey1加密,加密后传输给服务器。

3、此时服务端收到客户端传输得密文,用私钥prikey1 进行解密,因为数据是用公钥pubkey1加密得,通过解密就可以得到客户端生成的公钥pubkey2

4、然后自己在生成对称加密,也就是我们的AES,其实就相当于我们配置中的那个16的长度的加密key,生成了这个key之后我们就用公钥pubkey2 进行加密,返回给客户端,因为只有客户端有pubkey2对应的私钥prikey2只有客户端才能进行解密,客户端得到数据之后用prikey2进行解密,得到AES得加密key,最后用加密key进行数据传输得加密,至此整个流程结束。

四 spring-boot-starter-encrypt 原理

启动类上得@EnableEncrypt注解是用来开启功能得,通过@import导入自动配置类

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Import({EncryptAutoConfiguration.class})

public @interface EnableEncrypt{

}

EncryptAutoConfiguration 中配置请求和响应得处理类,用的是spring中得RequestBodyAdvice 和 ResponseBodyAdvise,在spring 中对请求进行统计处理比较方便。如果还要更底层去封装那就要从servlet 那块去处理了

@configuration

@Component

@EnableAutoConfiguration

@EnableConfigurationProperties(EncryptProperties.class)

public class EncryptAutoConfiguration{

/**配置请求解密*/

@Bean

public EncryptResonseBodyAdvice encryptResponseBodyAdvice(){

   return new EncryptResonseBodyAdvice();

}

/**配置请求加密*/

@Bean

public EncryptRequestBodyAdvice encryptRequesBodyAdvice(){

   return new EncryptRequestBodyAdvice();

}

}

通过对RequestBodyAdvice和ResponseBodyAdvice就可以对请求响应做处理了。

注:本文来源于网络非本人原创 

题外扩展其它:

JAVA自定义注释(Target,Retention,Documented,Inherit)

(1)指定目标

注解target类型 枚举

public enum ElementType {

TYPE,// Class, interface, or enum (but not annotation)

FIELD,// Field (including enumerated values)

METHOD,// Method (does not include constructors)

PARAMETER,// Method parameter

CONSTRUCTOR,// Constructor

LOCAL_VARIABLE,// Local variable or catch clause

ANNOTATION_TYPE,// Annotation Types (meta-annotations)

PACKAGE// Java package

}

(2)设置持久性

package java.lang.annotation;

public enum RetentionPolicy {

SOURCE,// Annotation is discarded by the compiler

CLASS,// Annotation is stored in the class file, but ignored by the VM

RUNTIME// Annotation is stored in the class file and read by the VM

}

(3)添加公共文档

  (4)   设置继承

上一篇下一篇

猜你喜欢

热点阅读