- 客户端携带参数
/**
* 将参数添加到请求头 map
* @return
*/
private Map<String, String> headerMap(String body) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("accessKey", accessKey);
// 一定不能发送给后端!
// hashMap.put("secretKey", secretKey);
hashMap.put("nonce", RandomUtil.randomNumbers(5));
hashMap.put("body", body);
hashMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
hashMap.put("sign", SignUtil.genSign(body, secretKey));
return hashMap;
}
- 服务端校验参数
- 使用同一套加密算法 / 签名生成算法
package com.ghost.leapiinterface.utils;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
/**
* 签名生成工具类
* @author 乐小鑫
* @version 1.0
* @Date 2024-02-02-15:43
*/
public class SignUtil {
/**
* 使用 MD5 加密算法生成签名
* @param body 用户参数
* @return 签名
*/
public static String genSign(String body, String secretKey) {
Digester md5 = new Digester(DigestAlgorithm.MD5);
String str = body.toString() + "." + secretKey;
return md5.digestHex(str);
}
}
@PostMapping("/user")
public String getNameByJSON(@RequestBody User user, HttpServletRequest request) {
// 获取请求头中携带的参数,校验调用接口的权限
String accessKey = request.getHeader("accessKey");
// String secretKey = request.getHeader("secretKey");
String nonce = request.getHeader("nonce");
String body = request.getHeader("body");
String timestamp = request.getHeader("timestamp");
String sign = request.getHeader("sign");
// TODO 实际上要从数据库查是否已分配给用户
if (!accessKey.equals("ghost")) {
throw new RuntimeException("无权限");
}
// 校验随机数
if (nonce.length() > 5) {
throw new RuntimeException("无权限");
}
// TODO 校验时间戳 timestamp:和当前时间不能超过 5 min
// 和客户端使用同一套加密算法进行校验
String serverSign = SignUtil.genSign(body, "abcdefg");// 实际上要从数据库中取出数据进行校验
if (!serverSign.equals(sign)) {
throw new RuntimeException("无权限");
}
// System.out.println("getNameByJSON 被调用,accessKey: " + accessKey + "; secretKey:" +secretKey);
return "POST 你的名字是:" + user.getUsername();
}
四、API 签名认证的六个参数
-
用户标识 accessKey
-
密钥 secretKey:不能传递给后端❗
-
用户参数
-
签名 sign
-
随机数 防重放
-
时间戳 timeStamp
附:对称加密、非对称加密和单向加密
- 对称加密
- 对称加密使用相同的密钥对数据进行加解密
- 发送方和接收方必须事先共享密钥,否则无法进行加解密
- 常见的对称加密算法:DES、3DES、AES 等
- 适用场景:适用于数据传输量较大、安全性要求不是特别高的场景
- 非对称加密
- 非对称加密则使用一对不同的密钥进行加解密,分别称为公钥和私钥
- 公钥可以公开,任何人都可以使用它对数据进行加密
- 私钥只能由密钥持有人保管,并用于解密数据
- 常见的非对称加密算法:RSA、DSA 等
- 适用场景:适用于对数据安全性要求较高的场景,例如数字签名、身份认证等
- 单向加密
- 只能对数据进行加密,而无法逆向解密回原始数据
- 举例:哈希函数
- 相同的输入始终产生相同的哈希值
- 即使输入数据发生微小变化,哈希值也会发生巨大变化
- 无法从哈希值推导出原始输入数据
- MD5、SHA-256 加密算法也是单向加密
举个例子,常见的哈希函数是 MD5 和 SHA-256。假设我们对字符串 “Hello, World!” 进行 MD5 哈希,得到的哈希值是 “65a8e27d8879283831b664bd8b7f0ad4”。无论我们多少次对这个字符串进行 MD5 哈希运算,都会得到相同的哈希值。但是,如果我们只知道哈希值 “65a8e27d8879283831b664bd8b7f0ad4”,是无法确定原始的字符串是 “Hello, World!” 的。
如何自学黑客&网络安全
黑客零基础入门学习路线&规划
初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的
视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
一些笔者自己买的、其他平台白嫖不到的视频教程。