2024,你还在写“赤裸裸”的API吗?

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、非对称加密


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

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

关于非对称加密的实现算法主要有: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”;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

[外链图片转存中…(img-tJa7AowE-1713798484122)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-k1iIBzJu-1713798484122)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值