首页 > 其他 > 详细

接口加密,Zuul网关解码转发

时间:2020-08-03 17:04:18      阅读:108      评论:0      收藏:0      [点我收藏+]
如果系统明文传输的数据会被不明身份的人用抓包工具抓取,从而威胁系统和数据的安全性,那么就要使用加密的方式来对数据接口进行加密
加密方式:
  摘要算法:加密方式不需要秘钥,加密后的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同密文
  对称加密:明文数据通过秘钥进行加密,传输到后台,在通过相同的密码进行解密操作,缺点就是如何把秘钥安全的传输到解密者
  非对称加密:数字签名使用私钥生成签名,使用公钥验证签名 通过公钥加密传输,通过私钥进行解密操作
秘钥生成工具:OpenSSlL
  使用OpenSSl生成rsa密钥对,密钥长度介于 512 - 65536 之间(JDK 中默认长度是1024),且必须是64 的倍数。密钥的常用文件格式有pem(文本存储)或者der(二进制存储),当使用Java API生成RSA密钥对时,公钥以X.509格式编码,私钥以PKCS#8格式编码,RSA使用pkcs协议定义密钥的存储结构等内容
      通过OpenssL生成的私钥还要经过OpenSSL进行PKCS#8的编码操作,JAVA需要使用的私钥需要经过PKCS#8编码
   生成秘钥对的方法可以参考这篇帖子 猛点我!
 
一般直接通过URL直接访问后端接口,实不可取的,通过Zuul进行解密转发,从而保证安全性
Zuul
YML配置文件 

server:
  port: #Zuul的端口号
spring:
  application:
    name: #Zuul的name
zuul:
  routes: 
    user_name: #user微服务的名称
      path: /user/** #配置请求URL的请求规则
      serviceId: user_name #指定Eureka注册中心中的服务id
      strip-prefix: true
      sentiviteHeaders:
      customSensitiveHeaders: true   #让zuul处理cookie和重定向
#Eurkea注册发现中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka/
  instance:
    prefer-ip-address: true
Zuul.pom文件配置
 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
 </dependencies>

ZuuL启动类

@SpringBootApplication
@EnableEurekaClient  //注册发现中心 
@EnableZuulProxy   //网关过滤器
public class EncryptApplication {
    public static void main(String[] args) {
        SpringApplication.run(EncryptApplication.class);
    }
}

//秘钥
public class RsaKeys {
    //服务器公钥
    private static final String serverPubKey = "使用OpenSSL生成的公钥";

    //服务器私钥(经过pkcs8格式处理)
    private static final String serverPrvKeyPkcs8 = "使用OpenSSL生成的私钥经过pkcs8格式处理";

    public static String getServerPubKey() {
        return serverPubKey;
    }

    public static String getServerPrvKeyPkcs8() {
        return serverPrvKeyPkcs8;
    }
}
//RSA解码加密,网上搜一下,很多
@Service("RsaService")
public class RsaServiceImpl implements RsaService {
    /***
     * RSA解密
     *
     * @param encryptData
     * @return
     * @throws Exception
     */
    public String RSADecryptDataPEM(String encryptData, String prvKey) throws Exception {
    	byte[] encryptBytes = encryptData.getBytes();
        byte[] prvdata = RSA.decryptByPrivateKey(Base64Utils.decode(encryptData), prvKey);

        String outString = new String(prvdata, "UTF-8");
        return outString;
    }
    
    @Override
	public String RSADecryptDataBytes(byte[] encryptBytes, String prvKey)
			throws Exception {
		// TODO Auto-generated method stub
    	byte[] prvdata = RSA.decryptByPrivateKey(encryptBytes, prvKey);
        String outString = new String(prvdata, "utf-8");
        return outString;
	}

    /***
     * RSA加密
     *
     * @param data
     * @return
     * @throws Exception
     */
    public String RSAEncryptDataPEM(String data, String pubKey) throws Exception {

        byte[] pubdata = RSA.encryptByPublicKey(data.getBytes("UTF-8"), pubKey);
        String outString = new String(Base64Utils.encode(pubdata));

        return outString;
    }

	@Override
	public String getRsaAlgorithm() {
		// TODO Auto-generated method stub
		KeyFactory keyFactory = null;
		try {
			keyFactory = KeyFactory.getInstance("RSA");
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return keyFactory.getAlgorithm();
	}

	
}
创建filter过滤器继承ZuulFilter
@Component
public class RSARequestFilter extends ZuulFilter {
   //RSA加密解密接口 
  @Autowired private RsaService rsaService; @Override public String filterType() { //过滤器在什么时候执行,在解密之前执行 return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { //执行顺序 return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1; } @Override public boolean shouldFilter() { //是否使用过滤器 return true; } @Override public Object run() throws ZuulException { //获取Conext对象应用上下文, 从中获取req,res对象 RequestContext cxt = RequestContext.getCurrentContext(); HttpServletRequest request = cxt.getRequest(); HttpServletResponse response = cxt.getResponse(); //存放加密数据的变量 String requestData = null; String decodeData = null; try { //从req中获取请求的内容,获取通过公钥加密后的数据, ServletInputStream inputStream = request.getInputStream(); //通过流的工具类,吧流的信息转换成string类型的,指定字符集utf-8,得到公钥加密后的数据 requestData = StreamUtils.copyToString(inputStream, Charsets.UTF_8); System.out.println("加密后的:" + requestData); if (!Strings.isNullOrEmpty(requestData)) { //如果得到的数据不为空,进行解密操作 decodeData = rsaService.RSADecryptDataPEM(requestData, RsaKeys.getServerPrvKeyPkcs8()); System.out.println("解密后的:" + decodeData); } //吧解密后的数据转发给对应服务request if (!Strings.isNullOrEmpty(decodeData)) { byte[] bytes = decodeData.getBytes(); cxt.setRequest(new HttpServletRequestWrapper(request) { @Override public ServletInputStream getInputStream() { return new ServletInputStreamWrapper(bytes); } @Override public int getContentLength() { return bytes.length; } @Override public long getContentLengthLong() { return bytes.length; } }); }   //进行转码操作 cxt.addZuulRequestHeader("Content-Type" , MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"); } catch (Exception e) { e.printStackTrace(); } return null; } }

  在POSTMan测试前,可以先成加密后的接口密文, 比如http://127.0.0.1:9002/user/user/2         本机的9002是你的Zuul网关端口,访问配置文件中要拦截的接口,解密后,转发到user微服务查询id 等于2的用户

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = EncryptApplication.class)
public class EncryptTest {
    @Autowired
    private RsaService rsaService;
    @Test
    public void genEncryptDataByPubKey() {
        String data = "{\"需要加密的明文\":\"需要加密的明文\"}";
        try {
            String encData = rsaService.RSAEncryptDataPEM(data, RsaKeys.getServerPubKey());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public  void  pojie() throws Exception {
        String mima = "明文加密后的秘钥";
        //调用解密
        String s = rsaService.RSADecryptDataPEM(mima, RsaKeys.getServerPrvKeyPkcs8());
        System.out.println(s);
    }
}

  

写的不是特别好,主要是自己学习用


  

接口加密,Zuul网关解码转发

原文:https://www.cnblogs.com/zxfirst/p/13427203.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!