先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
1.cookie(一般服务器来设置,现在使用不多)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>客户端的网站</h2>
<button>设置cookie</button>
</body>
<script>
/**
* 在浏览器通过js设置cookie(很少用)
* 没设置max-age(过期时间,/毫秒),是内存cookie
* 设置max-age是硬盘cookie
*/
const btnE1=document.querySelector('button')
btnE1.onclick=function(){
document.cookie='age=12'
document.cookie='name=why;max-age=30'
}
</script>
</html>
服务端设置node
cookie
const Koa = require('koa');
const Router = require('@koa/router');
const app = new Koa();
const router = new Router({ prefix: '/users' });
router.get('/login', (ctx, next) => {
ctx.cookies.set('username', 'zs', {
maxAge: 24 * 60 * 60 * 1000,
})
ctx.body = 'users page';
});
router.get('/list', (ctx, next) => {
const value = ctx.cookies.get('username');
console.log(value)
if (value === 'zs') {
ctx.body = `userslist--${value}`;
} else {
ctx.body = '没有权限,请先登录';
}
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3004, () => {
console.log('服务器启动成功')
}
)
cookie-sessionID
相当于session的升级,加密,双重加密
const Koa = require('koa');
const Router = require('@koa/router');
const koasession = require('koa-session');
const app = new Koa();
const router = new Router({ prefix: '/users' });
// ---------
const session = koasession({
key: 'SESSION_ID',
maxAge: 60 * 60 * 1000,
signed: true, //加密
}, app)
app.keys = ['some secret hurr']; //加盐操作,随便写点值,相当于双重认证
app.use(session);
// ---------
router.get('/login', (ctx, next) => {
ctx.session.yan = 'ikub'
ctx.body = '登录成功';
});
router.get('/list', (ctx, next) => {
const value = ctx.session.yan
console.log(value)
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3004, () => {
console.log('服务器启动成功')
}
)
为什么cookie **|**cookie-sessionID不常用了?
Cookie和Session都是在Web开发中常用的技术,用于在用户访问网站时跟踪和存储用户信息。它们虽然都用于此目的,但它们在实现方式、存储位置、安全性等方面存在显著差异。
- 实现方式和存储位置:
- Cookie是服务器在本地机器上存储的小段文本,并随每一个请求发送至同一服务器。它主要保存在客户端,即用户的浏览器上。
- Session则是保存在服务器端的,是一种用来存放用户数据的类HashTable结构。当浏览器首次发送请求时,服务器会生成一个HashTable和一个Session ID,并通过响应发送给浏览器。之后的请求中,浏览器会将这个Session ID包含在请求中,以便服务器识别并恢复对应的用户会话。
- 存储内容:
- Cookie只能存储ASCII字符串,需要通过编码方式才能存储为Unicode字符或者二进制数据。
- Session则能够存储任何类型的数据,包括string、integer、list、map等。
- 安全性:
- Cookie对客户端是可见的,因此存在被分析、窃取或进行cookie欺骗的风险,这使得它在安全性方面相对较弱。
- Session存储在服务器上,对客户端是透明的,因此不存在敏感信息泄漏的风险,安全性相对较高。
- 有效期:
- 通过设置cookie的属性,可以实现cookie的长期有效。
- 它的过期时间通常是由服务器设置的,并且可以是一个较长的固定时间段,比如几小时或几天,这取决于服务器端的配置。
- 服务器压力:
- 由于cookie保存在客户端,不占用服务器资源,因此对服务器的压力较小。
- Session保存在服务器端,每个用户的会话信息都需要在服务器上维护,因此当用户量较大时,可能会对服务器造成较大压力。
总的来说,Cookie和Session在Web开发中各有其用途。Cookie主要用于在客户端保存一些用户信息,如登录状态等,而Session则主要用于在服务器端保存用户的会话信息。它们之间的选择通常取决于具体的应用场景和需求。
–
当结合使用Cookie和Session时,关闭浏览器页面并不一定会销毁Session。实际上,Session的销毁与浏览器的关闭行为并没有直接的联系,而是取决于Session的过期时间设置以及服务器的Session管理策略。
以下是关于Session销毁的一些关键点:
- 过期时间:Session通常会有一个过期时间,这是服务器设置的。当Session达到这个过期时间后,即使浏览器仍然打开,Session也会被自动销毁。过期时间的设置可以在服务器端进行配置,常见的设置方式包括基于固定时间间隔的过期(如30分钟)或基于用户活动的过期(如用户最后一次操作后的某个时间)。
- 服务器管理:服务器负责管理和跟踪所有的Session。当服务器检测到某个Session已经过期或者由于其他原因(如资源限制、服务器重启等)需要销毁时,它会主动销毁这个Session。
- 浏览器关闭:关闭浏览器只是断开了客户端与服务器之间的连接,它并不会直接销毁服务器端的Session。也就是说,即使你关闭了浏览器,服务器仍然会保留对应的Session信息,直到Session过期或被服务器主动销毁。
- 手动销毁:在某些情况下,你可能需要在服务器端手动销毁某个Session,比如用户明确退出登录或者管理员强制结束某个会话。这通常可以通过调用服务器端的Session管理API来实现。
- Cookie与Session的关系:Cookie在这里扮演的是传递Session ID的角色。即使你关闭了浏览器,只要Cookie中的Session ID没有过期并且没有被清除,下次你打开浏览器并访问同一网站时,浏览器仍然会发送包含这个Session ID的Cookie给服务器,从而恢复之前的会话。
因此,结合使用Cookie和Session时,关闭浏览器页面并不会直接导致Session的销毁。要销毁Session,需要依赖于服务器端的Session管理策略和过期时间的设置。
jwt生成token
token
const Koa = require('koa');
const Router = require('@koa/router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router({ prefix: '/users' });
const secret = 'secretxxx';
router.get('/login', (ctx, next) => {
//颁发token
/**
* payload: string | object | Buffer,
* secretOrPrivateKey: jwt.Secret,
* options?: jwt.SignOptions | undefined): string (+4 overloads)
*/
const token = jwt.sign(
{ id: 1 },
secret,
{ expiresIn: '1h' });
ctx.body = {
token,
message: '成功'
};
});
router.get('/list', (ctx, next) => {
const authorization = ctx.headers.authorization;
const token = authorization.replace('Bearer ', '');
console.log(token)
//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzEwMTI1MTE4LCJleHAiOjE3MTAxMjg3MTh9.s3nYx08tvwTk086cNkZK-0_KQ-ytBBfothOMlOOuclw
//验证token
try {
const result = jwt.verify(token, secret);
console.log(result)
//{ id: 1, iat: 1710125118, exp: 1710128718 }
//验证成功去数据库查数据返回数据
ctx.body = {
message: '成功',
code: 0,
list: [
{ name: 'zs', age: 18 },
{ name: 'ls', age: 20 }
]
}
} catch (error) {
ctx.body = {
message: 'token过期||无效的token',
code: 1,
}
}
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3004, () => {
console.log('服务器启动成功')
}
)
算法:
HS256 =>针对对称加密
const Koa = require('koa');
const Router = require('@koa/router');
const jwt = require('jsonwebtoken');
const app = new Koa();
const router = new Router({ prefix: '/users' });
const secret = 'secretxxx';
router.get('/login', (ctx, next) => {
//颁发token
/**
* payload: string | object | Buffer,
* secretOrPrivateKey: jwt.Secret,
* options?: jwt.SignOptions | undefined): string (+4 overloads)
*/
const token = jwt.sign(
{ id: 1 },
secret,
{ expiresIn: '1h' });
ctx.body = {
token,
message: '成功'
};
});
router.get('/list', (ctx, next) => {
const authorization = ctx.headers.authorization;
const token = authorization.replace('Bearer ', '');
console.log(token)
//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzEwMTI1MTE4LCJleHAiOjE3MTAxMjg3MTh9.s3nYx08tvwTk086cNkZK-0_KQ-ytBBfothOMlOOuclw
//验证token
try {
const result = jwt.verify(token, secret);
console.log(result)
//{ id: 1, iat: 1710125118, exp: 1710128718 }
//验证成功去数据库查数据返回数据
ctx.body = {
message: '成功',
code: 0,
list: [
{ name: 'zs', age: 18 },
{ name: 'ls', age: 20 }
]
}
} catch (error) {
ctx.body = {
message: 'token过期||无效的token',
code: 1,
}
}
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3004, () => {
console.log('服务器启动成功')
}
)
RS256=>针对非对称加密
使用git bash 终端
要生成RSA私钥和公钥,你可以使用OpenSSL这个强大的工具。以下是如何使用OpenSSL生成一个私钥和对应的公钥的步骤:
- 生成私钥
首先,你需要生成一个私钥。在命令行中,使用以下命令:
bash复制代码
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048 |
这个命令会生成一个2048位的RSA私钥,并将其保存在private_key.pem
文件中。
- 从私钥中提取公钥
有了私钥之后,你可以从中提取出对应的公钥。使用以下命令:
bash复制代码
openssl rsa -pubout -in private_key.pem -out public_key.pem |
这个命令会从private_key.pem
文件中读取私钥,并提取出公钥,然后将公钥保存到public_key.pem
文件中。
现在,你拥有了一个私钥文件private_key.pem
和一个公钥文件public_key.pem
。
注意:
- 私钥是保密的,只有你自己或你信任的系统应该能够访问它。不要将私钥泄露给任何人。
- 公钥可以公开分享,用于验证由私钥签名的数据。
- 在生产环境中,你应该使用安全的方式来存储和管理私钥,例如使用硬件安全模块(HSM)或密钥管理服务(KMS)。
如果你正在开发一个需要用到这些密钥的应用程序,你需要在你的代码中安全地加载这些密钥文件。确保你的应用程序不会将这些文件的内容暴露给未经授权的用户或系统
const Koa = require('koa');
const Router = require('@koa/router');
const jwt = require('jsonwebtoken');
const fs = require('fs');
const app = new Koa();
const router = new Router({ prefix: '/users' });
// 颁发私钥,验证私钥
const privateKey = fs.readFileSync('./keys/private_key.pem');
const publicKey = fs.readFileSync('./keys/public_key.pem');
router.get('/login', (ctx, next) => {
//颁发token
/**
* payload: string | object | Buffer,
* secretOrPrivateKey: jwt.Secret,
* options?: jwt.SignOptions | undefined): string (+4 overloads)
*/
const token = jwt.sign({ id: 1 }, privateKey,
{
expiresIn: '1h',
algorithm: 'RS256' //签名算法,默认为HS256
});
ctx.body = {
token,
message: '成功'
};
});
router.get('/list', (ctx, next) => {
const authorization = ctx.headers.authorization;
const token = authorization.replace('Bearer ', '');
console.log(token)
//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzEwMTI1MTE4LCJleHAiOjE3MTAxMjg3MTh9.s3nYx08tvwTk086cNkZK-0_KQ-ytBBfothOMlOOuclw
//验证token
try {
const result = jwt.verify(token, publicKey, {
algorithms: ['RS256'] //签名算法,默认为HS256
});
console.log(result)
//{ id: 1, iat: 1710125118, exp: 1710128718 }
//验证成功去数据库查数据返回数据
ctx.body = {
message: '成功',
code: 0,
list: [
{ name: 'zs', age: 18 },
{ name: 'ls', age: 20 }
]
}
} catch (error) {
ctx.body = {
message: 'token过期||无效的token',
code: 1,
}
}
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3004, () => {
console.log('服务器启动成功')
}
)
### 一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
![在这里插入图片描述](https://img-blog.csdnimg.cn/aa7be04dc8684d7ea43acc0151aebbf1.png)
### 二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0aeee2eec7a48f4ad7d083932cb095d.png)
### 三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
![在这里插入图片描述](https://img-blog.csdnimg.cn/078ea1d4cda342f496f9276a4cda5fcf.png)
### 四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e54c0bac8f3049928b488dc1e5080fc5.png)
### 五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/23a81b269c08c8765c8cf063ee7b0c57.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
mg-blog.csdnimg.cn/e54c0bac8f3049928b488dc1e5080fc5.png)
### 五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-qldy7sAc-1713259375839)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**