前言

新的项目要开始了,由于项目中涉及到和第三方厂商的接口对接,所有对接口的安全性有要求,下来我们看看如何写好一个规范的接口

如何保证接口传输中数据安全

保证数据安全,大家首先能想到的就是对内容进行加密。加密的话主要有两种方式,对称加密和非对称加密。

1、对称加密

我们先一起看一张图

可以看到,上图中采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密的强度取决于密钥的大小,密钥也大,越难破解,但同时加密和解密的过程中耗时也更长。常用的对称加密算法有DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。下面我们看下使用DES进行对称加密的示例。 首先是加密部分

/*** 加密* @param data 待加密内容* @param secretKey 密钥* @return*/public static byte[] encrypt(byte[] data, String secretKey) {try {SecureRandom random = new SecureRandom();DESKeySpec desKey = new DESKeySpec(secretKey.getBytes());// 创建一个密匙工厂,然后用它把DESKeySpec转换成SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey securekey = keyFactory.generateSecret(desKey);// Cipher对象实际完成加密操作Cipher cipher = Cipher.getInstance("DES");// 用密匙初始化Cipher对象,ENCRYPT_MODE用于将 Cipher 初始化为加密模式的常量cipher.init(Cipher.ENCRYPT_MODE, securekey, random);// 现在,获取数据并加密return cipher.doFinal(data);} catch (Throwable e) {e.printStackTrace();}return null;}

然后是解密部分

/*** 解密* @param src* @param secretKey* @return* @throws Exception*/public static byte[] decrypt(byte[] src, String secretKey) throws Exception {// DES算法要求有一个可信任的随机数源SecureRandom random = new SecureRandom();// 创建一个DESKeySpec对象DESKeySpec desKey = new DESKeySpec(secretKey.getBytes());// 创建一个密匙工厂,返回实现指定转换的SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 将DESKeySpec对象转换成SecretKey对象SecretKey secureKey1 = keyFactory.generateSecret(desKey);// 获取Cipher对象Cipher cipher = Cipher.getInstance("DES");// 初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secureKey1, random);// 解密return cipher.doFinal(src);}

接下来我们测试下

 public static void main(String[] args) throws Exception {// 待加密内容String str = "https://juejin.cn/user/2084329778071479";// 密钥String secretKey = "xtianyaa";byte[] encrypt = encrypt(str.getBytes(), secretKey);System.out.println("加密前:" +str);System.out.println("加密后:" + new String(encrypt));// 解密byte[] decrypt = decrypt(encrypt, secretKey);System.out.println("解密后:" + new String(decrypt));}

输出结果

加密前:https://juejin.cn/user/2084329778071479
加密后:SA(��j�tj��G΃/�[M(��y�݇t.�7z"D�3�<
解密后:https://juejin.cn/user/2084329778071479

2、非对称加密

非对称加密算法需要两个密钥:公钥私钥。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。我们看下非对称加密和对称加密的区别

非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

关于非对称加密的实现算法主要有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法),使用最广泛的是RSA算法。

如何证明你是你

关于API接口另一个重要的部分就是签名,通过签名,才知道接口的调用方有没有被进行篡改。下面一起看下接口签名的实现

 /**** @param appId  调用方的ID,唯一* @param appKey 调用方APP_KEY,每个调用方固定一个字符串,唯一* @param sign   签名,appId+appKey + request秘钥(不参与接口参数传递,本地保存) + 时间戳(以long类型的字符串.格式:yyyyMMddHHmmss),经过MD5加密后生成的串(字母小写)* @param requestTime 时间戳(以long类型的字符串)* @param type  数据类型* @param data  数据内容  使用非对称加密,接口调用者用公钥加密,接收后用私钥进行解密* @return*/@PostMapping("/system_api")@Limit(key = "get_system_api", period = 60, count = 10, name = "主屏接口数据采集", prefix = "limit")public String systemApi(@RequestHeader("APP_ID") String appId,@RequestHeader("APP_KEY") String appKey,@RequestHeader("TOKEN") String sign,@RequestHeader("TIMESTAMP") String requestTime,@RequestParam String type, @RequestBody String data){String checkInfo = paramsCheck(appId,appKey,sign,requestTime);if(!SUCCESS.equals(checkInfo)){return checkInfo;}return SUCCESS;}

可以看到,其中sign通过appId+appKey + request秘钥+ 时间戳,经过MD5加密后生成,当我们拿到这个sign时,再根据对应的参数进行验证

*** 根据接口请求的参数进行身份验证* @param appId* @param appKey* @param sign* @param requestTime*/private String paramsCheck(String appId, String appKey, String sign, String requestTime) {AppConfig appConfig =  appConfigService.getAppConfig(appId);String errorInfo = SUCCESS;//1、判断key是否正确if (!appKey.equals(appConfig.getAppKey())){errorInfo = "500";}//2、拼接字符串String key = appId+appConfig.getAppKey()+appConfig.getAppSecret()+requestTime;//3、根据appId+appKey+AppSecret+requestTime,经过md5后, 生成签名String newSign = DigestUtils.md5DigestAsHex(key.getBytes());//4、判断签名是否经过篡改if(!sign.equals(newSign)){errorInfo = "500";}//5、判断请求时间是否异常,防止使用过期签名进行身份认证Date date = null;try {date = new SimpleDateFormat("yyyyMMddHHmmss").parse(requestTime);} catch (ParseException e) {log.error(e.getMessage());}long second = 0;if (date != null) {second = getDatePoor(new Date(),date);}else{errorInfo = "TIME IS NULL";}if(second>TIME_OUT){errorInfo = "TIME OUT";}return errorInfo;}

可以看到我们在生成sign时增加了时间戳字段,主要就是防止他们利用获取到的sign直接进行使用,而一旦加了时间戳的话,就可以进行过期处理。

总结

一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传以后,毫无意外的短短半个小时点赞量就达到了 13k,说实话还是有点不可思议的。

一千道互联网 Java 工程师面试题

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)

初级—中级—高级三个级别的大厂面试真题

阿里云——Java 实习生/初级

List 和 Set 的区别 HashSet 是如何保证不重复的

HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)?

HashMap 的扩容过程

HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?

对象的四种引用

Java 获取反射的三种方法

Java 反射机制

Arrays.sort 和 Collections.sort 实现原理 和区别

Cloneable 接口实现原理

异常分类以及处理机制

wait 和 sleep 的区别

数组在内存中如何分配

答案展示:

美团——Java 中级

BeanFactory 和 ApplicationContext 有什么区别

Spring Bean 的生命周期

Spring IOC 如何实现

说说 Spring AOP

Spring AOP 实现原理

动态代理(cglib 与 JDK)

Spring 事务实现方式

Spring 事务底层原理

如何自定义注解实现功能

Spring MVC 运行流程

Spring MVC 启动流程

Spring 的单例实现原理

Spring 框架中用到了哪些设计模式

为什么选择 Netty

说说业务中,Netty 的使用场景

原生的 NIO 在 JDK 1.7 版本存在 epoll bug

什么是 TCP 粘包/拆包

TCP 粘包/拆包的解决办法

Netty 线程模型

说说 Netty 的零拷贝

Netty 内部执行流程

答案展示:

蚂蚁金服——Java 高级

题 1:

  1. jdk1.7 到 jdk1.8 Map 发生了什么变化(底层)?

  2. ConcurrentHashMap

  3. 并行跟并发有什么区别?

  4. jdk1.7 到 jdk1.8 java 虚拟机发生了什么变化?

  5. 如果叫你自己设计一个中间件,你会如何设计?

  6. 什么是中间件?

  7. ThreadLock 用过没有,说说它的作用?

  8. Hashcode()和 equals()和==区别?

  9. mysql 数据库中,什么情况下设置了索引但无法使用?

  10. mysql 优化会不会,mycat 分库,垂直分库,水平分库?

  11. 分布式事务解决方案?

  12. sql 语句优化会不会,说出你知道的?

  13. mysql 的存储引擎了解过没有?

  14. 红黑树原理?

题 2:

  1. 说说三种分布式锁?

  2. redis 的实现原理?

  3. redis 数据结构,使⽤场景?

  4. redis 集群有哪⼏种?

  5. codis 原理?

  6. 是否熟悉⾦融业务?记账业务?蚂蚁⾦服对这部分有要求。

好啦~展示完毕,大概估摸一下自己是青铜还是王者呢?

前段时间,在和群友聊天时,把今年他们见到的一些不同类别的面试题整理了一番,于是有了以下面试题集,也一起分享给大家~

如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群,领取资料

基础篇


JVM 篇


MySQL 篇



Redis 篇




由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

需要的小伙伴,可以一键三连,下方获取免费领取方式!

2021,你还在写“赤裸裸”的API吗?来试试这个方法吧!相关推荐

  1. 2021你还在手写SQL吗?万字综述Text to SQL技术

    Text to SQL综述 一.背景 二.任务介绍 三.数据集 四.方法 4.1 基于模板和规则 4.2 基于Seq2Seq框架 4.2.1 编码方法 4.2.1.1 Table-aware 4.2. ...

  2. js 强校验 弱校验_还在手写表单校验逻辑?试试spring validation吧

    Java识堂,一个高原创,高收藏,有干货的微信公众号,欢迎关注 前言 数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的 ...

  3. 移动端兼容性测试你还在用adb安装app?快试试这种方法吧!

    一.写在前面 在做Android移动端兼容性测试时,我们经常会将手机连接PC,然后通过adb的命令将被测app安装进手机,一台手机测完后跟着操作下一台,如此往复很是费事. ps:公司有兼容性测试平台且 ...

  4. 用python写通用restful api service(一)

    一直在用node.js做后端,要逐步涉猎大数据范围,注定绕不过python,因此决定把一些成熟的东西用python来重写,一是开拓思路.通过比较来深入学习python:二是有目标,有动力,希望能持之以 ...

  5. (六)改掉这些坏习惯,还怕写不出精简的代码?

    鲁迅说:嬉笑怒骂里充满了无奈和妥协. 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? ...

  6. 50岁还在写代码,大龄前端程序员到底有多吃香

    大家好呀!我是小千学姐 程序员圈流传着这样一个段子:35岁之后,干前端去送外卖:搞后端去开滴滴:运维就去买保险-- 招人不要35岁的,裁人清理35岁的,不知道什么时候开始,35岁成了职业生涯的拐点,中 ...

  7. (五)改掉这些坏习惯,还怕写不出精简的代码?

    鲁迅说:嬉笑怒骂里充满了无奈和妥协. 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协. Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的 ...

  8. 2021年还适合参加软件测试培训吗

    随着互联网行业快速的发展,人们对于互联网技术更为关注,大部分人都想了解2021年还适合参加软件测试培训吗?软件测试在互联网是相对学起来比较简单的,来看看下面的详细介绍吧. 2021年还适合参加软件测试 ...

  9. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...

    Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇, ...

最新文章

  1. 2022-2028年中国塑料编织品的制造行业市场竞争态势及投资方向分析报告
  2. 【C/C++】排序算法
  3. 能不做自己写个类,也叫java.lang.String
  4. 最大子列和问题(JAVA)
  5. igllib 204 gradient
  6. tspline工具_Rhino 6 如何使用 T-spline?
  7. python画航线图_Python获取航线信息并且制作成图的讲解
  8. 分享几个设计精美电路图的工具
  9. Java 数字转换为汉语中人民币的大写
  10. 纵横算法之三:算法到底考什么
  11. 重复工作到底有没有意义
  12. 2003服务器安全策略
  13. uva10827 - Maximum sum on a torus(最大子矩阵和变形)
  14. zyt-python
  15. 利用photoshop去掉图片中文字
  16. 做为一名大数据新手,如何成为大数据工程师?附上学习路线
  17. 南京信息工程大学 2021年 考研 软件工程 复试经验分享
  18. 嵌入式软件设计(串口调试)
  19. linux ln 链接
  20. Win10无需管理员权限删除任意文件 管理员权限删除文件

热门文章

  1. 元器件TVS管与ESD静电二极管的三处不同,你知道吗?
  2. Linux驱动开发:字符设备驱动开发实战
  3. 安装深度linux系统卡住不动,Deepin Linux 15(.1)启动即卡死的问题
  4. java如何向数组里添加元素
  5. 10分钟轻松学会 Python turtle 绘图
  6. clickhouse之bitmap
  7. 一文搞懂选举人算法(Raft算法)
  8. 内网访问外网以及外网访问内网的原理
  9. royaleapi中文版_火法削减为4费?皇室战争6月平衡性改动前瞻 三枪或增强
  10. GUI+Mysql 仿照水果超市实现简易学生管理系统