先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
邮件协议中常用的有两种:POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol),用于接收邮件;SMTP(Simple Mail Transfer Protocol),用于发送邮件。这些协议都可以使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)来提供安全的邮件传输。
- POP3和IMAP:这两种协议都有两种方式来使用SSL/TLS。一种是在连接建立后立即开始SSL/TLS握手,这种方式通常使用专门的端口,例如POP3通常使用995端口,IMAP通常使用993端口。另一种方式是先使用普通的POP3或IMAP协议建立连接,然后使用STARTTLS命令来开始SSL/TLS握手,这种方式通常使用标准的POP3(110)或IMAP(143)端口。
- SMTP:SMTP也有两种方式来使用SSL/TLS。一种是在连接建立后立即开始SSL/TLS握手,这种方式通常使用465端口。另一种方式是先使用普通的SMTP协议建立连接,然后使用STARTTLS命令来开始SSL/TLS握手,这种方式通常使用标准的SMTP端口(25或587)。
在使用SSL/TLS的过程中,邮件客户端会验证服务器的证书,以确保服务器的身份。同时,邮件客户端和服务器会协商一个加密算法和密钥,用于加密邮件内容。这样,即使邮件在传输过程中被拦截,攻击者也无法读取邮件内容,从而保护了邮件的安全。
需要注意的是,虽然SSL/TLS可以保护邮件在传输过程中的安全,但无法保护邮件在服务器上的安全。因此,用户还需要注意保护自己的邮件账户,例如使用强密码,定期更换密码,开启二步验证等。
二、安全威胁:中间人攻击
尽管SSL提供了强大的安全保护,但仍存在一些威胁。例如,中间人攻击(MITM)是一种常见的威胁,攻击者在客户端和服务器之间插入自己,截取和可能篡改通信内容。此外,如果服务器的私钥被泄露,那么所有的SSL通信都可能被解密。
SSL证书的主要目的是保护用户免受中间人攻击,但如果不正确地使用,或者在某些情况下,SSL证书也可能被用于进行中间人攻击。以下是一个简化的过程:
- 拦截:与普通的中间人攻击一样,攻击者首先需要找到一种方法拦截通信。这可能通过在公共WiFi网络中设置一个假的WiFi热点,或者通过网络路由器进行ARP欺骗等方式实现。
- 伪造证书:攻击者需要伪造一个看起来像目标服务器的SSL证书。这个证书可能完全伪造,也可能是一个由不受信任的证书颁发机构签发的证书。
- 握手:当用户试图与服务器建立SSL连接时,攻击者会拦截这个连接,然后使用伪造的证书与用户建立一个SSL连接。同时,攻击者也会与服务器建立一个SSL连接。
- 通信:此时,用户和服务器之间的所有通信都会经过攻击者。攻击者可以解密用户发送给服务器的信息,然后再加密发送给服务器;同样,攻击者也可以解密服务器发送给用户的信息,然后再加密发送给用户。
一个著名的中间人攻击案例是2011年的DigiNotar事件。DigiNotar是荷兰的一个证书颁发机构,2011年,它被攻击者入侵,攻击者伪造了包括Google在内的多个网站的SSL证书。这些伪造的证书被用于对伊朗的用户进行中间人攻击,攻击者可以截取和篡改用户与这些网站的通信。这个事件最终导致DigiNotar破产。
这个案例表明,即使使用SSL证书,也不能完全防止中间人攻击。用户应该注意检查SSL证书的有效性,包括证书的颁发机构,证书的有效期,以及证书的主题是否匹配网站的域名。同时,用户也应该注意不要在不安全的网络环境中进行敏感操作,例如在公共WiFi网络中进行网银操作。
三、最佳实践
- 使用强密码:服务器的私钥应该使用强密码保护,防止被破解。
- 定期更新证书:SSL证书有有效期,过期后需要更新。不定期更新证书也是一种好的安全实践,可以防止证书被长时间利用。
- 使用最新的SSL/TLS版本:旧版本的SSL和TLS存在已知的安全漏洞,应该使用最新的版本。
- 启用HSTS:HTTP Strict Transport Security (HSTS)可以强制客户端只使用HTTPS连接,防止中间人攻击。
四、Android中的SSL证书
在Android应用中使用SSL,通常需要将服务器的证书导入到应用中。这可以通过在应用的资源文件中包含一个证书文件,然后在代码中使用SSLContext和TrustManagerFactory类加载这个证书来实现。这样,应用可以创建一个安全的SSL连接,与服务器进行安全的通信。
然而,在处理SSL证书时,Android应用需要注意一些特殊的安全问题。首先,应避免“信任所有证书”的做法,因为这会使应用容易受到中间人攻击。中间人攻击者可以伪造任意的证书,如果应用信任所有证书,那么攻击者就可以截获和篡改应用的通信数据。
其次,应用需要正确处理证书链的验证。一般来说,服务器的证书不是直接由根证书颁发机构(CA)签发的,而是由一系列的中间CA签发的。因此,验证服务器证书的时候,需要按照证书链,从服务器证书开始,依次验证每个证书的签名,直到根证书。只有当整个证书链都被验证通过,才能确认服务器证书的有效性。
此外,Android应用也可以选择使用系统的根证书。Android系统内置了一套受信任的根证书,应用可以通过TrustManagerFactory类获取系统的默认TrustManager,使用系统的根证书来验证服务器证书。这样,应用就无需单独导入服务器证书,可以简化证书处理的流程。但是,这也意味着应用将信任系统中所有的根证书,如果系统的根证书被篡改或滥用,可能会带来安全风险。
总的来说,处理SSL证书是Android应用网络安全的重要环节。开发者需要熟悉SSL证书的工作原理,正确使用SSLContext和TrustManagerFactory类,避免常见的安全问题,以保证应用的网络通信安全。
五、如何接受特定证书指纹的SSL证书
如果你只想接受特定证书指纹的证书,你需要在你的代码中添加额外的逻辑来检查服务器的证书指纹。以下是使用Java、C++(libcurl库)和Go语言进行特定证书指纹校验的示例代码:
- Java:
在Java中,你可以在你的TrustManager中添加额外的逻辑来检查证书指纹:
import javax.net.ssl.\*;
import java.net.URL;
import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
public class Main {
public static void main(String[] args) throws Exception {
final String expectedFingerprint = "EXPECTED\_FINGERPRINT";
TrustManager[] trustManager = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
for (Certificate cert : certs) {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] publicKey = md.digest(cert.getPublicKey().getEncoded());
StringBuilder hexString = new StringBuilder();
for (byte b : publicKey) {
String hex = Integer.toHexString(0xff & b);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
if (hexString.toString().equals(expectedFingerprint)) {
return;
}
}
throw new CertificateException("Invalid certificate");
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustManager, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
URL url = new URL("https://www.example.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.connect();
conn.getInputStream();
}
}
- C++(libcurl库):
在C++的libcurl库中,你可以使用CURLOPT_SSL_CTX_FUNCTION选项来设置一个回调函数,该函数在SSL握手时被调用,你可以在这个函数中检查证书指纹。以下是一个使用OpenSSL库进行证书指纹检查的示例:
#include <curl/curl.h>
#include <openssl/ssl.h>
#include <openssl/x509.h>
#include <openssl/sha.h>
static CURLcode sslctx\_function(CURL \*curl, void \*sslctx, void \*parm) {
X509_STORE \*store;
SSL_CTX \*ctx = (SSL_CTX \*)sslctx;
X509 \*cert = NULL;
unsigned char md[EVP_MAX_MD_SIZE];
unsigned int mdlen;
char \*fingerprint;
store = SSL\_CTX\_get\_cert\_store(ctx);
// 这里假设你已经有了一个X509证书对象cert
// 你可以从store中获取证书,或者从文件中读取证书
if (!X509\_digest(cert, EVP\_sha256(), md, &mdlen)) {
// 处理错误
}
fingerprint = (char \*)malloc(3 \* mdlen);
for (int i = 0; i < mdlen; i++) {
sprintf(&fingerprint[3\*i], "%02X:", md[i]);
}
fingerprint[3\*mdlen - 1] = '\0';
// 检查fingerprint是否与你期望的一致
// 如果不一致,返回一个错误码,例如CURLE\_SSL\_CACERT
free(fingerprint);
return CURLE_OK;
}
int main() {
CURL \*curl = curl\_easy\_init();
if(curl) {
curl\_easy\_setopt(curl, CURLOPT_URL, "https://www.example.com");
curl\_easy\_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
CURLcode res = curl\_easy\_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl\_easy\_perform() failed: %s\n", curl\_easy\_strerror(res));
}
curl\_easy\_cleanup(curl);
}
return 0;
}
这个示例中的sslctx_function函数会在SSL握手时被调用,你可以在这个函数中获取服务器的证书,并计算其指纹。然后你可以检查这个指纹是否与你期望的一致。如果不一致,你可以返回一个错误码,例如CURLE_SSL_CACERT,这将导致curl_easy_perform函数失败。
请注意,这个示例中的sslctx_function函数假设你已经有了一个X509证书对象。在实际使用中,你可能需要从SSL_CTX对象的证书存储中获取证书,或者从文件中读取证书。这部分代码可能会比较复杂,需要对OpenSSL库有一定的了解。
- Go语言:
在Go语言中,你可以在tls.Config中设置InsecureSkipVerify为true,然后在VerifyPeerCertificate中添加额外的逻辑来检查证书指纹:
### 一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
![在这里插入图片描述](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)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**