计算机网络- 传输层安全性
传输层安全性
- 7. 传输层安全性
- 7.1 传输层安全基础
- 7.1.1 安全需求
- 机密性(Confidentiality)
- 完整性(Integrity)
- 真实性(Authenticity)
- 不可否认性(Non-repudiation)
- 7.1.2 常见安全威胁
- 窃听(Eavesdropping)
- 数据篡改(Tampering)
- 中间人攻击(Man-in-the-Middle Attack)
- 会话劫持(Session Hijacking)
- 拒绝服务攻击(Denial of Service Attack)
- 重放攻击(Replay Attack)
- 7.1.3 密码学基础
- 对称加密
- 非对称加密
- 哈希函数
- 消息认证码(MAC)
- 数字签名
- 密钥交换
- 7.1.4 公钥基础设施(PKI)
- 数字证书
- 证书颁发机构(CA)
- 证书撤销
- 证书信任链
- PKI在传输层安全中的应用
- 7.2 TLS/SSL协议
- 7.2.1 TLS/SSL发展历史
- SSL 1.0
- SSL 2.0
- SSL 3.0
- TLS 1.0
- TLS 1.1
- TLS 1.2
- TLS 1.3
- 7.2.2 TLS/SSL协议架构
- 记录协议(Record Protocol)
- 上层协议
- 7.2.3 TLS握手过程
- TLS 1.2握手过程
- TLS 1.3握手过程
- 7.2.4 TLS密钥生成
- TLS 1.2密钥生成
- TLS 1.3密钥生成
- 7.2.5 TLS加密套件
- 7.2.6 TLS扩展
- 服务器名称指示(SNI)
- 应用层协议协商(ALPN)
- 签名算法
- 密钥共享
- 预共享密钥(PSK)
- 7.2.7 TLS实现与应用
- 常见TLS实现
- TLS在应用中的使用
- 7.3 传输层安全最佳实践
- 7.3.1 TLS配置最佳实践
- 协议版本
- 加密套件
- 证书配置
- 会话管理
- OCSP装订
- HTTP严格传输安全(HSTS)
- 7.3.2 常见安全漏洞及防护
- BEAST攻击
- POODLE攻击
- FREAK攻击
- Logjam攻击
- Heartbleed漏洞
- ROBOT攻击
- CRIME和BREACH攻击
- 7.3.3 性能优化
- 会话恢复优化
- 硬件加速
- 连接复用
- 证书优化
- 7.3.4 安全监控与审计
- TLS配置扫描
- 日志监控
- 证书监控
- 安全事件响应
- 7.3.5 合规性与标准
- PCI DSS要求
- HIPAA安全规则
- NIST指南
- GDPR考虑
7. 传输层安全性
随着互联网的普及和网络应用的增多,传输层安全性变得越来越重要。本章将深入探讨传输层安全的基本概念、常见威胁、安全协议(如TLS/SSL)以及实现安全传输的最佳实践。
7.1 传输层安全基础
传输层安全是指在传输层提供的安全服务,主要目标是保护数据在传输过程中的机密性、完整性和真实性。
7.1.1 安全需求
在网络通信中,传输层安全需要满足以下几个基本需求:
机密性(Confidentiality)
机密性确保只有授权方能够读取传输的数据,防止未授权方获取敏感信息。机密性通常通过加密技术实现,将明文数据转换为密文,只有拥有正确密钥的接收方才能解密。
机密性的重要性体现在:
- 保护用户隐私信息(如个人身份、财务数据)
- 防止商业机密泄露
- 保护认证凭据(如密码、令牌)
- 防止通信内容被窃听
完整性(Integrity)
完整性确保数据在传输过程中不被篡改,或者至少能够检测到篡改。完整性通常通过消息认证码(MAC)或数字签名实现,接收方可以验证数据是否被修改。
完整性的重要性体现在:
- 防止交易数据被篡改
- 确保命令和控制信息的准确性
- 防止恶意代码注入
- 确保配置信息的正确性
真实性(Authenticity)
真实性确保通信双方的身份是真实的,防止身份欺骗。真实性通常通过数字证书和公钥基础设施(PKI)实现,通信方可以验证对方的身份。
真实性的重要性体现在:
- 防止中间人攻击
- 确保连接到正确的服务器
- 防止身份冒充
- 建立信任关系
不可否认性(Non-repudiation)
不可否认性确保通信方不能否认自己发送过的消息。不可否认性通常通过数字签名和时间戳实现,提供发送方身份的加密证明。
不可否认性的重要性体现在:
- 电子合同和协议
- 金融交易
- 法律证据
- 责任归属
7.1.2 常见安全威胁
传输层面临多种安全威胁,了解这些威胁有助于设计更安全的系统。以下是一些常见的传输层安全威胁:
窃听(Eavesdropping)
窃听是指未授权方监听网络通信,获取敏感信息。由于网络数据可能经过多个中间节点,任何节点都可能被攻击者控制用于窃听。
窃听的特点:
- 被动攻击,难以检测
- 不改变数据内容,只是获取信息
- 可以在任何网络节点进行
- 可以针对有线或无线网络
防御措施:
- 使用加密技术保护数据机密性
- 使用安全协议(如TLS/SSL)
- 避免在不安全网络传输敏感信息
- 使用VPN创建加密通道
数据篡改(Tampering)
数据篡改是指攻击者修改传输中的数据,破坏数据完整性。攻击者可能插入、删除或修改数据包内容,导致接收方获取错误信息。
数据篡改的特点:
- 主动攻击,改变数据内容
- 可能导致系统行为异常
- 可能用于注入恶意代码
- 可能用于欺骗用户或系统
防御措施:
- 使用消息认证码(MAC)验证数据完整性
- 使用数字签名
- 使用安全协议(如TLS/SSL)
- 实施完整性检查机制
中间人攻击(Man-in-the-Middle Attack)
中间人攻击是指攻击者插入到通信双方之间,拦截、可能修改并转发消息,使双方认为他们在直接通信。
中间人攻击的特点:
- 可以同时破坏机密性、完整性和真实性
- 攻击者可以完全控制通信内容
- 难以检测,特别是在初始连接阶段
- 可以用于窃取凭据、注入恶意内容等
防御措施:
- 使用强认证机制
- 验证数字证书
- 使用安全协议(如TLS/SSL)
- 实施证书固定(Certificate Pinning)
- 使用额外的身份验证渠道
会话劫持(Session Hijacking)
会话劫持是指攻击者获取并使用合法用户的会话标识符,冒充该用户进行操作。
会话劫持的特点:
- 通常在认证后发生
- 可能利用会话标识符的弱点
- 可能通过窃听或XSS攻击获取会话信息
- 攻击者可以获得与合法用户相同的权限
防御措施:
- 使用加密通信
- 实施会话超时机制
- 使用安全的会话管理
- 绑定会话到客户端特征(如IP地址)
- 使用HTTPS保护会话标识符
拒绝服务攻击(Denial of Service Attack)
拒绝服务攻击是指攻击者通过消耗系统资源使服务不可用。在传输层,常见的DoS攻击包括SYN洪水、TCP重置攻击等。
拒绝服务攻击的特点:
- 目标是破坏可用性而非窃取信息
- 可能使用大量合法请求消耗资源
- 可能利用协议弱点(如TCP三次握手)
- 分布式DoS(DDoS)使用多个源点攻击
防御措施:
- 实施速率限制
- 使用SYN cookie防御SYN洪水
- 部署防火墙和入侵检测系统
- 使用内容分发网络(CDN)分散流量
- 实施流量分析和异常检测
重放攻击(Replay Attack)
重放攻击是指攻击者捕获并重新发送之前的合法数据包,试图重复某些操作或欺骗系统。
重放攻击的特点:
- 不需要理解数据内容,只需重放
- 可能用于重复交易、认证等操作
- 可能绕过某些安全机制
- 即使数据加密也可能实施
防御措施:
- 使用时间戳
- 使用随机数(nonce)
- 实施序列号机制
- 使用会话标识符
- 限制消息有效期
7.1.3 密码学基础
密码学是传输层安全的基础,提供了保护数据的工具和技术。以下是一些关键的密码学概念:
对称加密
对称加密使用相同的密钥进行加密和解密。常见的对称加密算法包括AES、DES、3DES等。
对称加密的特点:
- 速度快,适合大量数据加密
- 密钥管理复杂,需要安全分发密钥
- 密钥数量随通信方数量平方增长
- 通常用于会话数据加密
AES(Advanced Encryption Standard)是目前最广泛使用的对称加密算法,下面是一个简化的AES加密示例:
#include <openssl/aes.h>
#include <string.h>// AES-256 加密示例
void aes_encrypt(const unsigned char *plaintext, int plaintext_len,const unsigned char *key, unsigned char *iv,unsigned char *ciphertext) {AES_KEY aes_key;AES_set_encrypt_key(key, 256, &aes_key);// 使用CBC模式加密AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT);
}// AES-256 解密示例
void aes_decrypt(const unsigned char *ciphertext, int ciphertext_len,const unsigned char *key, unsigned char *iv,unsigned char *plaintext) {AES_KEY aes_key;AES_set_decrypt_key(key, 256, &aes_key);// 使用CBC模式解密AES_cbc_encrypt(ciphertext, plaintext, ciphertext_len, &aes_key, iv, AES_DECRYPT);
}
非对称加密
非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密;或者私钥用于签名,公钥用于验证。常见的非对称加密算法包括RSA、ECC、DSA等。
非对称加密的特点:
- 解决了密钥分发问题
- 计算复杂度高,速度较慢
- 适合小量数据加密或数字签名
- 通常用于密钥交换和身份认证
RSA是最广泛使用的非对称加密算法之一,下面是一个简化的RSA加密示例:
#include <openssl/rsa.h>
#include <openssl/pem.h>// RSA 加密示例
int rsa_encrypt(const unsigned char *plaintext, int plaintext_len,unsigned char *ciphertext, RSA *rsa) {return RSA_public_encrypt(plaintext_len, plaintext, ciphertext,rsa, RSA_PKCS1_PADDING);
}// RSA 解密示例
int rsa_decrypt(const unsigned char *ciphertext, int ciphertext_len,unsigned char *plaintext, RSA *rsa) {return RSA_private_decrypt(ciphertext_len, ciphertext, plaintext,rsa, RSA_PKCS1_PADDING);
}// 生成RSA密钥对
RSA *generate_rsa_key(int bits) {RSA *rsa = RSA_new();BIGNUM *e = BN_new();BN_set_word(e, RSA_F4); // 65537RSA_generate_key_ex(rsa, bits, e, NULL);BN_free(e);return rsa;
}
哈希函数
哈希函数将任意长度的输入转换为固定长度的输出(哈希值),用于数据完整性检查。常见的哈希算法包括MD5、SHA-1、SHA-256等。
哈希函数的特点:
- 单向函数,无法从哈希值恢复原始数据
- 相同输入产生相同输出
- 输入的微小变化导致输出的显著变化
- 计算效率高
- 抗碰撞性(难以找到产生相同哈希值的不同输入)
SHA-256是目前广泛使用的哈希算法,下面是一个简化的SHA-256哈希示例:
#include <openssl/sha.h>// SHA-256 哈希示例
void sha256_hash(const unsigned char *data, size_t data_len, unsigned char *hash) {SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, data, data_len);SHA256_Final(hash, &sha256);
}
消息认证码(MAC)
消息认证码结合了哈希函数和密钥,用于验证消息的完整性和真实性。常见的MAC算法包括HMAC、CMAC等。
MAC的特点:
- 需要发送方和接收方共享密钥
- 提供数据完整性和真实性保证
- 不提供不可否认性(因为密钥共享)
- 计算效率高
HMAC-SHA256是常用的MAC算法,下面是一个简化的HMAC-SHA256示例:
#include <openssl/hmac.h>// HMAC-SHA256 示例
void hmac_sha256(const unsigned char *data, size_t data_len,const unsigned char *key, size_t key_len,unsigned char *mac) {HMAC_CTX *ctx = HMAC_CTX_new();HMAC_Init_ex(ctx, key, key_len, EVP_sha256(), NULL);HMAC_Update(ctx, data, data_len);unsigned int mac_len;HMAC_Final(ctx, mac, &mac_len);HMAC_CTX_free(ctx);
}
数字签名
数字签名使用私钥对消息的哈希值进行加密,接收方可以使用公钥验证签名,确保消息的完整性、真实性和不可否认性。
数字签名的特点:
- 使用非对称加密
- 提供数据完整性、真实性和不可否认性
- 计算复杂度高
- 通常只对消息的哈希值签名,而非整个消息
RSA数字签名是常用的签名算法,下面是一个简化的RSA签名示例:
#include <openssl/rsa.h>
#include <openssl/sha.h>// RSA 签名示例
int rsa_sign(const unsigned char *data, size_t data_len,unsigned char *signature, RSA *rsa) {// 计算数据的SHA-256哈希值unsigned char hash[SHA256_DIGEST_LENGTH];SHA256(data, data_len, hash);// 对哈希值进行签名unsigned int sig_len;return RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH,signature, &sig_len, rsa);
}// RSA 验证签名示例
int rsa_verify(const unsigned char *data, size_t data_len,const unsigned char *signature, size_t sig_len,RSA *rsa) {// 计算数据的SHA-256哈希值unsigned char hash[SHA256_DIGEST_LENGTH];SHA256(data, data_len, hash);// 验证签名return RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH,signature, sig_len, rsa);
}
密钥交换
密钥交换允许通信双方在不安全的通道上安全地协商共享密钥。常见的密钥交换算法包括Diffie-Hellman(DH)、椭圆曲线Diffie-Hellman(ECDH)等。
密钥交换的特点:
- 不需要预共享密钥
- 即使通信被监听,攻击者也无法获取密钥
- 通常用于建立对称加密的会话密钥
- 可能容易受到中间人攻击,需要额外的认证机制
Diffie-Hellman是经典的密钥交换算法,下面是一个简化的DH密钥交换示例:
#include <openssl/dh.h>
#include <openssl/bn.h>// Diffie-Hellman 密钥交换示例// 生成DH参数
DH *generate_dh_params(int prime_len) {DH *dh = DH_new();DH_generate_parameters_ex(dh, prime_len, DH_GENERATOR_2, NULL);return dh;
}// 生成公钥和私钥
void generate_dh_key(DH *dh) {DH_generate_key(dh);
}// 计算共享密钥
int compute_shared_key(unsigned char *shared_key, const BIGNUM *pub_key, DH *dh) {return DH_compute_key(shared_key, pub_key, dh);
}
7.1.4 公钥基础设施(PKI)
公钥基础设施(Public Key Infrastructure,PKI)是一套用于创建、管理、分发、使用、存储和撤销数字证书的系统,为非对称加密提供可信的公钥分发机制。
数字证书
数字证书是由可信的第三方(证书颁发机构,CA)签发的电子文档,用于证明公钥持有者的身份。X.509是最常用的数字证书标准。
数字证书通常包含以下信息:
- 证书持有者的身份信息
- 证书持有者的公钥
- 证书颁发机构的身份信息
- 证书有效期
- 证书序列号
- 证书签名算法
- 证书颁发机构的签名
下面是一个简化的X.509证书结构:
Certificate:Data:Version: 3 (0x2)Serial Number: 12345 (0x3039)Signature Algorithm: sha256WithRSAEncryptionIssuer: CN=Example CA, O=Example Organization, C=USValidity:Not Before: Jan 1 00:00:00 2023 GMTNot After : Dec 31 23:59:59 2023 GMTSubject: CN=example.com, O=Example Inc., C=USSubject Public Key Info:Public Key Algorithm: rsaEncryptionRSA Public Key: (2048 bit)Modulus: ...Exponent: 65537 (0x10001)X509v3 extensions:X509v3 Basic Constraints: CA:FALSEX509v3 Key Usage: Digital Signature, Key EnciphermentX509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.comSignature Algorithm: sha256WithRSAEncryptionSignature: ...
证书颁发机构(CA)
证书颁发机构是PKI中的可信第三方,负责验证证书申请者的身份并签发数字证书。CA的可信度是PKI安全的基础。
CA的主要职责包括:
- 验证证书申请者的身份
- 签发数字证书
- 维护证书撤销列表(CRL)
- 提供证书状态查询服务(如OCSP)
- 安全存储CA私钥
CA通常组织为层次结构:
- 根CA:最高级别的CA,自签名证书
- 中间CA:由根CA或更高级别的中间CA签发证书
- 终端CA:直接向终端实体签发证书
证书撤销
当证书不再可信(如私钥泄露、证书持有者身份变更等)时,需要撤销证书。证书撤销的主要机制包括:
证书撤销列表(CRL):
- CA定期发布已撤销证书的列表
- 包含撤销证书的序列号和撤销日期
- 客户端需要定期下载和检查CRL
- 可能导致较大的带宽消耗和延迟
在线证书状态协议(OCSP):
- 提供实时证书状态查询
- 客户端发送查询请求,OCSP响应者返回证书状态
- 减少带宽消耗,提供更及时的状态信息
- 可能增加连接建立的延迟
证书信任链
证书信任链是从终端实体证书到可信根证书的证书路径。验证证书时,需要验证整个信任链上的每个证书。
信任链验证的步骤:
- 验证证书签名
- 检查证书是否在有效期内
- 检查证书是否被撤销
- 验证证书用途是否符合使用场景
- 对颁发者证书重复上述步骤,直到根证书
信任链的安全性取决于最弱的环节,任何中间CA的妥协都可能导致伪造证书。
PKI在传输层安全中的应用
PKI在传输层安全中主要用于:
- 服务器身份验证:确保客户端连接到合法服务器
- 客户端身份验证:确保服务器接受合法客户端的连接
- 安全密钥交换:防止中间人攻击
- 数据完整性保护:检测数据篡改
TLS/SSL协议广泛使用PKI进行身份验证和密钥交换,是传输层安全的基础。
7.2 TLS/SSL协议
传输层安全协议(Transport Layer Security,TLS)和其前身安全套接字层(Secure Sockets Layer,SSL)是最广泛使用的传输层安全协议,为网络通信提供加密、身份验证和数据完整性保护。
7.2.1 TLS/SSL发展历史
TLS/SSL协议经历了多次演进,每个版本都解决了前一版本的安全问题并提供了更好的性能。
SSL 1.0
- 1994年由Netscape开发
- 从未公开发布,存在严重安全漏洞
SSL 2.0
- 1995年发布
- 第一个公开的SSL版本
- 存在多个安全漏洞,如可以降级到弱加密
- 已被弃用,不应再使用
SSL 3.0
- 1996年发布
- 对SSL 2.0进行了重大改进
- 仍存在安全问题,如POODLE攻击
- 已被弃用,不应再使用
TLS 1.0
- 1999年发布,定义在RFC 2246
- 基于SSL 3.0,但有足够差异使其不兼容
- 存在一些安全问题,如BEAST攻击
- 已被弃用,不应再使用
TLS 1.1
- 2006年发布,定义在RFC 4346
- 改进了对CBC模式的保护
- 添加了对IANA参数注册的支持
- 已被弃用,不应再使用
TLS 1.2
- 2008年发布,定义在RFC 5246
- 允许使用更安全的加密算法(如SHA-256)
- 改进了伪随机函数
- 增强了客户端和服务器的扩展能力
- 目前仍广泛使用
TLS 1.3
- 2018年发布,定义在RFC 8446
- 简化了握手过程,减少了往返次数
- 移除了不安全的加密算法和机制
- 引入了0-RTT模式,减少连接建立延迟
- 改进了隐私保护
- 当前最新版本,提供最佳安全性和性能
7.2.2 TLS/SSL协议架构
TLS/SSL协议由两层组成:
记录协议(Record Protocol)
记录协议是TLS/SSL的基础层,负责数据的分片、压缩、加密和传输。记录协议处理的步骤包括:
- 分片:将上层数据分割成适当大小的块
- 压缩(可选):压缩数据以减少传输量
- 加密和认证:使用协商的加密算法和密钥加密数据,并添加MAC或使用AEAD算法
- 传输:将处理后的数据传输给下层协议(通常是TCP)
记录协议的数据格式:
+-------------+-------------+---------------+-------------+
| Content | Version | Length | Payload |
| Type (8b) | (16b) | (16b) | (变长) |
+-------------+-------------+---------------+-------------+
- Content Type:指示上层协议类型(如握手、警告、应用数据等)
- Version:TLS/SSL版本
- Length:Payload长度
- Payload:加密后的数据和MAC
上层协议
TLS/SSL的上层协议包括:
握手协议(Handshake Protocol):
- 负责协商安全参数和密钥
- 验证服务器和客户端身份
- 建立安全通信通道
警告协议(Alert Protocol):
- 传输错误和警告消息
- 指示连接状态变化
- 分为致命错误和警告两类
变更密码规范协议(Change Cipher Spec Protocol):
- 通知对方后续消息将使用新协商的密钥和算法
- 在TLS 1.3中已被移除
应用数据协议(Application Data Protocol):
- 传输应用层数据
- 使用记录协议提供的安全服务
7.2.3 TLS握手过程
TLS握手是建立安全连接的关键步骤,不同版本的TLS握手过程有所不同。
TLS 1.2握手过程
TLS 1.2的握手需要两个往返(2-RTT),步骤如下:
-
客户端Hello:
- 客户端发送支持的TLS版本、加密套件、压缩方法和随机数
- 可能包含扩展信息,如SNI(Server Name Indication)
-
服务器Hello:
- 服务器选择TLS版本、加密套件、压缩方法和随机数
- 发送服务器证书
- 可能请求客户端证书
- 发送ServerHelloDone消息
-
客户端密钥交换:
- 客户端验证服务器证书
- 生成预主密钥(Pre-Master Secret)
- 使用服务器公钥加密预主密钥并发送
- 如果需要,发送客户端证书和证书验证消息
- 发送ChangeCipherSpec消息,表示后续使用协商的密钥
- 发送Finished消息,包含之前所有消息的哈希值
-
服务器完成:
- 服务器使用私钥解密预主密钥
- 双方使用预主密钥和随机数生成主密钥(Master Secret)
- 从主密钥派生会话密钥
- 服务器发送ChangeCipherSpec消息
- 服务器发送Finished消息,验证握手的完整性
-
开始加密通信:
- 握手完成,双方使用协商的密钥和算法进行加密通信
TLS 1.2握手的时序图:
客户端 服务器| ||------------------ ClientHello ------------------>|| ||<----------------- ServerHello -------------------||<----------------- Certificate -------------------||<--------------- ServerHelloDone ----------------|| ||---------------- ClientKeyExchange -------------->||---------------- ChangeCipherSpec -------------->||-------------------- Finished ------------------->|| ||<---------------- ChangeCipherSpec ---------------||<-------------------- Finished -------------------|| ||----------------- Application Data -------------->||<----------------- Application Data ---------------|| |
TLS 1.3握手过程
TLS 1.3简化了握手过程,只需要一个往返(1-RTT),步骤如下:
-
客户端Hello:
- 客户端发送支持的TLS版本、加密套件和随机数
- 包含密钥共享扩展,发送客户端的DH公钥
- 可能包含其他扩展,如PSK(Pre-Shared Key)
-
服务器响应:
- 服务器选择TLS版本和加密套件
- 发送服务器证书和证书验证消息
- 发送服务器的DH公钥
- 计算共享密钥并派生会话密钥
- 发送Finished消息,使用派生的密钥加密
-
客户端完成:
- 客户端验证服务器证书
- 计算共享密钥并派生会话密钥
- 发送Finished消息,使用派生的密钥加密
-
开始加密通信:
- 握手完成,双方使用协商的密钥和算法进行加密通信
TLS 1.3还支持0-RTT模式,允许客户端在第一个消息中发送加密的应用数据,进一步减少延迟。
TLS 1.3握手的时序图:
客户端 服务器| ||------------------ ClientHello ------------------>|| (密钥共享) || ||<----------------- ServerHello -------------------||<---------------- Certificate --------------------||<----------- CertificateVerify -------------------||<----------------- Finished ---------------------|| ||------------------- Finished -------------------->|| ||----------------- Application Data -------------->||<----------------- Application Data ---------------|| |
7.2.4 TLS密钥生成
TLS使用一系列密钥派生函数生成会话密钥,确保通信安全。
TLS 1.2密钥生成
TLS 1.2的密钥生成过程:
-
生成预主密钥(Pre-Master Secret):
- 对于RSA密钥交换:客户端生成随机的预主密钥,使用服务器公钥加密
- 对于DH密钥交换:通过DH算法计算共享密钥作为预主密钥
-
生成主密钥(Master Secret):
- 使用PRF(伪随机函数)从预主密钥、客户端随机数和服务器随机数派生48字节的主密钥
master_secret = PRF(pre_master_secret, "master secret",ClientHello.random + ServerHello.random) -
派生会话密钥:
- 从主密钥派生多个密钥材料,包括:
- 客户端写入MAC密钥
- 服务器写入MAC密钥
- 客户端写入加密密钥
- 服务器写入加密密钥
- 客户端写入IV(如果需要)
- 服务器写入IV(如果需要)
key_block = PRF(master_secret, "key expansion",ServerHello.random + ClientHello.random) - 从主密钥派生多个密钥材料,包括:
TLS 1.3密钥生成
TLS 1.3简化了密钥生成过程,使用HKDF(HMAC-based Key Derivation Function):
-
计算共享密钥:
- 通过ECDHE或DHE密钥交换计算共享密钥
-
派生早期密钥(用于0-RTT):
- 如果使用PSK,从PSK派生早期密钥
-
派生握手密钥:
- 从共享密钥派生握手流量密钥,用于加密握手消息
-
派生应用数据密钥:
- 从握手密钥派生应用数据流量密钥,用于加密应用数据
TLS 1.3的密钥派生使用以下HKDF函数:
HKDF-Extract(salt, IKM) -> PRK
HKDF-Expand(PRK, info, L) -> OKM
其中:
- salt:盐值,增加随机性
- IKM:输入密钥材料(如共享密钥)
- PRK:伪随机密钥
- info:上下文信息
- L:输出长度
- OKM:输出密钥材料
7.2.5 TLS加密套件
TLS加密套件是一组算法的组合,用于提供安全服务。加密套件通常包括:
- 密钥交换算法:如RSA、DH、ECDH
- 身份验证算法:如RSA、DSA、ECDSA
- 批量加密算法:如AES、ChaCha20
- 消息认证码算法:如HMAC-SHA256、Poly1305
TLS 1.2加密套件的命名格式:
TLS_密钥交换_身份验证_WITH_批量加密_消息认证码
例如:
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:使用ECDHE密钥交换、RSA身份验证、AES-256-GCM加密和SHA-384哈希
TLS 1.3简化了加密套件,只指定对称加密算法和哈希算法,密钥交换和身份验证算法在扩展中指定。
TLS 1.3加密套件的命名格式:
TLS_批量加密_哈希
例如:
TLS_AES_256_GCM_SHA384:使用AES-256-GCM加密和SHA-384哈希
7.2.6 TLS扩展
TLS扩展允许协议在不改变基本结构的情况下添加新功能。一些重要的TLS扩展包括:
服务器名称指示(SNI)
SNI允许客户端在握手开始时指定要连接的服务器名称,使得多个虚拟主机可以共享同一个IP地址。
// SNI扩展示例
struct {NameType name_type; // 通常是host_name(0)opaque hostname<1..2^16-1>;
} ServerName;struct {ServerName server_name_list<1..2^16-1>;
} ServerNameList;
应用层协议协商(ALPN)
ALPN允许客户端和服务器协商应用层协议(如HTTP/1.1、HTTP/2、SPDY等),避免额外的往返。
// ALPN扩展示例
struct {opaque protocol_name<1..2^8-1>;
} ProtocolName;struct {ProtocolName protocol_name_list<2..2^16-1>;
} ProtocolNameList;
签名算法
签名算法扩展允许客户端指定支持的签名和哈希算法组合,增强安全性和灵活性。
// 签名算法扩展示例
enum {rsa(1), dsa(2), ecdsa(3), ed25519(7), ed448(8), /* 其他 */
} SignatureAlgorithm;enum {none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), sha512(6), /* 其他 */
} HashAlgorithm;struct {HashAlgorithm hash;SignatureAlgorithm signature;
} SignatureAndHashAlgorithm;struct {SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
} SignatureAlgorithmsExtension;
密钥共享
TLS 1.3中的密钥共享扩展用于传输客户端和服务器的公钥,支持多种密钥交换算法。
// 密钥共享扩展示例
enum {secp256r1(23), secp384r1(24), secp521r1(25), x25519(29), x448(30), /* 其他 */
} NamedGroup;struct {NamedGroup group;opaque key_exchange<1..2^16-1>;
} KeyShareEntry;struct {KeyShareEntry client_shares<0..2^16-1>;
} KeyShareClientHello;
预共享密钥(PSK)
PSK扩展允许使用之前建立的共享密钥恢复会话,减少握手开销。TLS 1.3中,PSK可以与密钥交换结合,提供前向安全性。
// PSK扩展示例
struct {opaque identity<1..2^16-1>;uint32 obfuscated_ticket_age;
} PskIdentity;struct {PskIdentity identities<7..2^16-1>;PskBinderEntry binders<33..2^16-1>;
} PreSharedKeyClientHello;
7.2.7 TLS实现与应用
TLS有多种实现,广泛应用于各种场景。
常见TLS实现
OpenSSL:
- 最广泛使用的开源TLS实现
- 支持多种平台和编程语言
- 提供丰富的加密功能和TLS支持
- 示例代码:
// OpenSSL客户端示例
#include <openssl/ssl.h>
#include <openssl/err.h>int create_tls_client(const char *hostname, int port) {SSL_CTX *ctx;SSL *ssl;int sockfd;struct sockaddr_in server_addr;// 初始化OpenSSLSSL_library_init();SSL_load_error_strings();OpenSSL_add_all_algorithms();// 创建SSL上下文ctx = SSL_CTX_new(TLS_client_method());if (!ctx) {ERR_print_errors_fp(stderr);return -1;}// 设置验证模式SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);SSL_CTX_set_verify_depth(ctx, 4);// 加载默认CA证书SSL_CTX_set_default_verify_paths(ctx);// 创建套接字并连接sockfd = socket(AF_INET, SOCK_STREAM, 0);memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);server_addr.sin_addr.s_addr = inet_addr(hostname);if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("Connect failed");close(sockfd);SSL_CTX_free(ctx);return -1;}// 创建SSL对象ssl = SSL_new(ctx);SSL_set_fd(ssl, sockfd);// 设置SNISSL_set_tlsext_host_name(ssl, hostname);// 执行TLS握手if (SSL_connect(ssl) <= 0) {ERR_print_errors_fp(stderr);SSL_free(ssl);close(sockfd);SSL_CTX_free(ctx);return -1;}// 验证证书if (SSL_get_verify_result(ssl) != X509_V_OK) {fprintf(stderr, "Certificate verification error\n");SSL_free(ssl);close(sockfd);SSL_CTX_free(ctx);return -1;}// 现在可以使用SSL_read和SSL_write进行安全通信return sockfd;
}
GnuTLS:
- GNU项目的TLS实现
- 注重安全性和标准合规性
- 使用LGPL许可证
NSS:
- Mozilla的网络安全服务库
- 用于Firefox、Thunderbird等Mozilla产品
- 支持PKCS#11接口
BoringSSL:
- Google基于OpenSSL的分支
- 简化API,移除不常用功能
- 用于Chrome、Android等Google产品
mbedTLS:
- ARM的轻量级TLS实现
- 适合嵌入式和资源受限设备
- 代码简洁,易于理解和集成
TLS在应用中的使用
HTTPS:
- 最常见的TLS应用
- 为HTTP提供加密和认证
- 使用443端口(默认)
- 示例URL:
https://example.com
SMTPS、POP3S、IMAPS:
- 为电子邮件协议提供安全性
- 保护邮件内容和认证信息
- 端口:SMTPS(465)、POP3S(995)、IMAPS(993)
FTPS:
- 安全文件传输协议
- 为FTP提供加密和认证
- 使用显式(FTPES,端口21)或隐式(FTPS,端口990)TLS
LDAPS:
- 安全轻量级目录访问协议
- 保护目录服务查询和认证
- 使用636端口
WebSockets Secure (WSS):
- 为WebSockets提供安全连接
- 使用443端口
- URL格式:
wss://example.com/socket
MQTT over TLS:
- 为物联网消息协议提供安全性
- 使用8883端口
- 保护设备通信和认证
7.3 传输层安全最佳实践
实施传输层安全需要遵循一系列最佳实践,以确保系统的安全性、性能和兼容性。
7.3.1 TLS配置最佳实践
正确配置TLS是确保传输层安全的关键。以下是一些TLS配置的最佳实践:
协议版本
- 禁用不安全的协议版本:禁用SSL 2.0、SSL 3.0、TLS 1.0和TLS 1.1,这些版本存在已知安全漏洞
- 优先使用TLS 1.3:TLS 1.3提供最佳的安全性和性能
- 支持TLS 1.2作为备选:为了兼容性,支持TLS 1.2,但使用安全的加密套件
配置示例(Nginx):
ssl_protocols TLSv1.2 TLSv1.3;
加密套件
- 优先使用AEAD加密套件:如AES-GCM、ChaCha20-Poly1305,它们提供认证加密
- 优先使用前向安全的密钥交换:如ECDHE、DHE,确保即使私钥泄露,过去的通信仍然安全
- 使用强密钥长度:AES-256、RSA-2048或更高
- 禁用弱加密算法:如RC4、DES、3DES、MD5
- 禁用已知不安全的加密套件:如包含SHA-1的套件
配置示例(Nginx):
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
证书配置
- 使用强密钥和算法:RSA-2048或更高,或ECDSA P-256/P-384
- 使用可信CA签发的证书:避免自签名证书(除非在受控环境)
- 包含完整的证书链:确保客户端能够验证整个信任链
- 配置正确的主机名:证书中的主机名应匹配服务的域名
- 使用Subject Alternative Name (SAN):支持多个域名
- 定期更新证书:在过期前更新,避免服务中断
配置示例(Nginx):
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
会话管理
- 启用会话恢复:减少重复握手的开销
- 使用会话票证(Session Tickets)或会话ID:允许客户端恢复会话
- 定期轮换会话票证密钥:增强安全性
- 设置适当的会话超时:平衡安全性和性能
配置示例(Nginx):
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
OCSP装订
- 启用OCSP装订:服务器预先获取证书状态并附加到TLS握手中
- 减少客户端OCSP查询:降低延迟,提高隐私
- 定期更新OCSP响应:确保状态信息最新
配置示例(Nginx):
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
HTTP严格传输安全(HSTS)
- 启用HSTS:告诉浏览器始终使用HTTPS连接
- 包含子域:保护所有子域
- 设置足够长的有效期:如一年或更长
配置示例(Nginx):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
7.3.2 常见安全漏洞及防护
了解和防护常见的TLS安全漏洞是确保传输层安全的重要部分。
BEAST攻击
漏洞描述:
- 影响TLS 1.0及以下版本
- 利用CBC模式的预测性IV
- 允许攻击者解密部分加密流量
防护措施:
- 升级到TLS 1.1或更高版本
- 优先使用AEAD加密套件
- 实施1/n-1分割(在客户端)
POODLE攻击
漏洞描述:
- 影响SSL 3.0
- 利用CBC模式的填充验证漏洞
- 允许攻击者解密加密流量
防护措施:
- 完全禁用SSL 3.0
- 使用TLS_FALLBACK_SCSV防止协议降级
FREAK攻击
漏洞描述:
- 影响支持导出级加密的服务器
- 允许攻击者将连接降级到弱加密
- 可能导致中间人攻击
防护措施:
- 禁用所有导出级加密套件
- 升级TLS库到最新版本
Logjam攻击
漏洞描述:
- 影响使用弱DH参数的服务器
- 允许攻击者将连接降级到弱DH密钥交换
- 可能导致中间人攻击
防护措施:
- 使用强DH参数(至少2048位)
- 优先使用ECDHE而非DHE
- 禁用导出级加密套件
Heartbleed漏洞
漏洞描述:
- 影响OpenSSL 1.0.1到1.0.1f版本
- 允许攻击者读取服务器内存
- 可能泄露私钥、会话密钥和敏感数据
防护措施:
- 升级OpenSSL到安全版本
- 更新服务器证书和私钥
- 撤销可能泄露的证书
ROBOT攻击
漏洞描述:
- 影响支持RSA加密的TLS实现
- 重现Bleichenbacher的攻击
- 允许攻击者解密RSA加密数据
防护措施:
- 禁用RSA密钥交换
- 优先使用ECDHE或DHE密钥交换
- 升级TLS库到最新版本
CRIME和BREACH攻击
漏洞描述:
- 利用压缩算法泄露信息
- CRIME针对TLS压缩,BREACH针对HTTP响应压缩
- 允许攻击者恢复加密数据(如会话cookie)
防护措施:
- 禁用TLS压缩
- 实施CSRF保护
- 对敏感响应禁用HTTP压缩
- 使用随机填充
7.3.3 性能优化
TLS可能引入额外的性能开销,但通过适当的优化可以最小化这种影响。
会话恢复优化
会话恢复允许客户端和服务器跳过完整的TLS握手,减少连接建立的延迟和计算开销。
会话缓存:
- 服务器存储会话状态
- 客户端通过会话ID恢复会话
- 适合单服务器或小型集群
配置示例(Nginx):
ssl_session_cache shared:SSL:10m; # 10MB共享缓存,约40000个会话
ssl_session_timeout 10m; # 会话有效期10分钟
会话票证:
- 服务器将会话状态加密并发送给客户端
- 客户端在后续连接中提供票证
- 适合大型分布式系统
- 需要安全管理票证密钥
配置示例(Nginx):
ssl_session_tickets on;
ssl_session_ticket_key /path/to/ticket.key; # 定期轮换
TLS 1.3 0-RTT:
- 允许客户端在第一个消息中发送应用数据
- 显著减少延迟
- 需要注意重放攻击风险
配置示例(Nginx,需要1.19.4+):
ssl_early_data on;
proxy_set_header Early-Data $ssl_early_data;
硬件加速
利用硬件加速可以显著提高TLS性能,特别是在高负载系统中。
CPU加速:
- 使用支持AES-NI的现代CPU
- 加速AES加密/解密操作
- 无需特殊配置,TLS库通常自动检测
专用加密硬件:
- 加密加速卡
- 硬件安全模块(HSM)
- 可显著提高RSA和ECC操作性能
OpenSSL配置示例:
# 使用引擎加速
openssl_conf = openssl_init[openssl_init]
engines = engine_section[engine_section]
pkcs11 = pkcs11_section[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib/engines/engine_pkcs11.so
MODULE_PATH = /usr/lib/opensc-pkcs11.so
init = 0
连接复用
HTTP/2和HTTP/3允许在单个TLS连接上多路复用多个请求,减少TLS握手次数。
HTTP/2配置:
- 启用HTTP/2支持
- 优化并发流数量
- 调整帧大小和窗口大小
配置示例(Nginx):
http2 on;
http2_max_concurrent_streams 128;
http2_idle_timeout 3m;
HTTP/3配置:
- 启用QUIC和HTTP/3支持
- 配置UDP缓冲区
- 设置适当的连接参数
配置示例(Nginx实验性支持):
http3 on;
quic_retry on;
quic_gso on;
证书优化
优化证书配置可以减少TLS握手的大小和处理时间。
证书链优化:
- 最小化证书链长度
- 按正确顺序提供证书(叶证书在前)
- 不包含根证书(客户端通常已有)
OCSP装订:
- 服务器预先获取OCSP响应
- 在TLS握手中提供
- 避免客户端单独查询OCSP
配置示例(Nginx):
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
证书类型选择:
- ECDSA证书比RSA证书小,验证更快
- 考虑使用P-256曲线平衡安全性和性能
- 确保客户端兼容性
7.3.4 安全监控与审计
持续监控和审计TLS配置和使用情况是维护传输层安全的重要部分。
TLS配置扫描
定期扫描TLS配置以检测弱点和漏洞。
自动化扫描工具:
- Qualys SSL Labs Server Test
- testssl.sh
- sslyze
- Nmap SSL脚本
示例命令:
# 使用testssl.sh扫描
testssl.sh --severity HIGH --hints https://example.com# 使用sslyze扫描
sslyze --regular example.com:443# 使用Nmap扫描
nmap --script ssl-enum-ciphers -p 443 example.com
检查项目:
- 支持的协议版本
- 加密套件强度
- 密钥交换方法
- 证书有效性和强度
- 已知漏洞
日志监控
监控TLS相关日志以检测异常和攻击尝试。
关键监控指标:
- TLS握手失败率
- 协议降级尝试
- 证书验证错误
- 加密套件协商模式
- 客户端TLS版本分布
日志配置示例(Nginx):
log_format ssl_log '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" ''$ssl_protocol $ssl_cipher';access_log /var/log/nginx/ssl_access.log ssl_log;
自动化分析:
- 使用ELK Stack(Elasticsearch, Logstash, Kibana)
- 设置异常检测规则
- 创建可视化仪表板
证书监控
监控证书状态和生命周期,避免过期导致服务中断。
监控项目:
- 证书过期日期
- 证书撤销状态
- 证书透明度日志
- 密钥算法和强度
自动化工具:
- Certbot(Let’s Encrypt客户端)
- cert-manager(Kubernetes证书管理)
- SSL监控服务
配置示例(Certbot自动更新):
# 添加到crontab
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
安全事件响应
制定TLS相关安全事件的响应计划。
常见事件类型:
- 私钥泄露
- 证书过期
- 新TLS漏洞公开
- 可疑TLS流量
响应步骤:
- 评估影响:确定漏洞或事件的严重性和影响范围
- 立即缓解:实施临时修复或缓解措施
- 更新系统:应用补丁或更新TLS配置
- 轮换凭据:如果需要,更新证书和密钥
- 通知利益相关者:根据需要通知用户和合作伙伴
- 记录经验教训:更新安全策略和程序
私钥泄露响应示例:
# 1. 生成新的私钥和CSR
openssl genrsa -out newkey.pem 2048
openssl req -new -key newkey.pem -out newcsr.pem# 2. 获取新证书# 3. 撤销旧证书# 4. 更新服务器配置
sed -i 's/oldkey.pem/newkey.pem/g' /etc/nginx/nginx.conf
sed -i 's/oldcert.pem/newcert.pem/g' /etc/nginx/nginx.conf# 5. 重新加载服务
systemctl reload nginx
7.3.5 合规性与标准
遵循行业标准和合规要求是实施传输层安全的重要考虑因素。
PCI DSS要求
支付卡行业数据安全标准(PCI DSS)对处理信用卡数据的系统有严格的TLS要求。
关键要求:
- 使用TLS 1.2或更高版本
- 禁用不安全的协议和加密套件
- 使用强密钥和证书
- 定期更新和测试TLS配置
- 记录和监控TLS使用情况
PCI DSS 4.0中的TLS要求:
- 要求4.2.1:使用强加密保护传输中的敏感数据
- 要求4.2.1.2:仅使用受信任的密钥和证书
- 要求4.2.2:仅使用安全的协议和配置
HIPAA安全规则
健康保险可携性和责任法案(HIPAA)对保护健康信息(PHI)的传输有安全要求。
关键要求:
- 使用加密保护电子PHI的传输
- 实施访问控制和身份验证
- 保护传输中数据的完整性
- 记录和监控安全事件
HIPAA合规TLS实践:
- 使用TLS 1.2或更高版本
- 实施双向TLS认证(mTLS)
- 使用强加密套件
- 定期审计TLS配置
NIST指南
美国国家标准与技术研究院(NIST)提供了TLS实施的详细指南。
关键文档:
- NIST SP 800-52 Rev. 2:《传输层安全(TLS)实施指南》
- NIST SP 800-57:《密钥管理建议》
- NIST SP 800-131A:《密码算法和密钥长度的过渡》
NIST TLS建议:
- 使用TLS 1.2或TLS 1.3
- 使用FIPS认可的加密算法
- 使用足够长的密钥(RSA ≥ 2048位,ECDSA ≥ P-256)
- 实施证书验证
- 使用前向安全的密钥交换
GDPR考虑
欧盟通用数据保护条例(GDPR)要求采取适当的技术措施保护个人数据。
关键要求:
- 实施数据保护的技术措施
- 确保传输安全
- 定期测试安全措施
- 记录数据处理活动
GDPR合规TLS实践:
- 使用最新的TLS版本和安全配置
- 实施证书透明度监控
- 定期审计和更新TLS配置
- 记录安全措施和事件
传输层安全是网络通信安全的基础,正确实施TLS/SSL协议对于保护数据机密性、完整性和真实性至关重要。通过遵循最佳实践、了解常见威胁、优化性能、实施监控和遵守合规要求,可以建立强大的传输层安全基础设施,为应用程序和用户提供可靠的保护。
相关文章:
计算机网络- 传输层安全性
传输层安全性 7. 传输层安全性7.1 传输层安全基础7.1.1 安全需求机密性(Confidentiality)完整性(Integrity)真实性(Authenticity)不可否认性(Non-repudiation) 7.1.2 常见安全威胁窃…...
常青藤快速选择系统介绍
功能特点 支持多种属性和特性:可依据实体属性(如实体类型、图层、颜色、线宽等)以及实体特性(如直线长度、圆面积、文字内容等)进行筛选。多过滤条件与运算符号:支持多个过滤条件组合,基本涵盖实…...
【c语言】指针习题
练习一:使用指针打印数组内容 #include <stdio.h> void print(int* p, int sz) {int i 0;for (i 0; i < sz; i) {printf("%d ", *p);//printf("%d ", *(p i));} } int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof…...
KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破
引言:数据智能的第三范式 在数字化转型进入深水区的2025年,企业数据系统正面临三重悖论:数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB(K…...
Sqoop常用指令
Sqoop(SQL-to-Hadoop)是一个开源工具,旨在将关系型数据库中的数据导入到Hadoop的HDFS中,或者从HDFS导出到关系型数据库中。以下是一些常用的Sqoop命令: 导入数据到HDFS 1. 基本导入 sqoop import \ --connect jdbc:mys…...
银行业务知识序言
银行业务知识体系全景解析 第一章 金融创新浪潮下的银行业务知识革命 1.1 数字化转型驱动金融业态重构 在区块链、人工智能、物联网等技术的叠加作用下,全球银行业正经历着"服务无形化、流程智能化、风控穿透化"的深刻变革。根据麦肯锡《2023全球银行业…...
智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战
一、说明 PyScada,一个基于Python和Django框架的开源SCADA(数据采集与监视控制系统)系统,采用HTML5技术打造人机界面(HMI)。它兼容多种工业协议,如Modbus TCP/IP、RTU、ASCII等,并具…...
畅游Diffusion数字人(23):字节最新表情+动作模仿视频生成DreamActor-M1
畅游Diffusion数字人(0):专栏文章导航 前言:之前有很多动作模仿或者表情模仿的工作,但是如果要在实际使用中进行电影级的复刻工作,仅仅表情或动作模仿还不够,需要表情和动作一起模仿。最近字节跳动提出了一个表情+动作模仿视频生成DreamActor-M1。 目录 贡献概述 核心动…...
【Unity网络编程知识】C#的 Http相关类学习
1、搭建HTTP服务器 使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用)自己编写HTTP服务器应用程序,一般作为Web服务器或者短连接游戏服务器时使用该方式(工作后由后端程序员来做&#…...
Python operator 模块介绍
operator 模块是 Python 标准库中的一个模块,它提供了一系列与 Python 内置运算符对应的函数。这些函数可以用于替代一些常见的运算符操作,在某些场景下能让代码更加简洁、高效,还能方便地用于函数式编程。以下是对 operator 模块的详细介绍: 1. 导入模块 使用 operator …...
SpringBoot企业级开发之【用户模块-更新用户头像】
功能如下所示: 我们先看一下接口文档: 为什么头像是一串字符串呢?因为我们是将头像图片放到第三方去存储,比如:阿里云等 开发思路: 实操: 1.controller 注意!这里使用【PatchMapping】注解…...
DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额
本系列目录 专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读400次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你…...
网络流量管理-流(Flow)
1. 传统网络的问题:快递员送信模式 想象你每天要寄100封信给同一个朋友,传统网络的处理方式就像一个固执的快递员: 每封信都单独处理:检查地址、规划路线、盖章、装车…即使所有信的目的地、收件人都相同,也要重复100…...
每日文献(十一)——Part two
今天从第四章:快速RCNN,方法细节开始介绍。 目录 四、快速RCNN:方法细节 4.1 快速R-CNN回顾 4.2 对抗网络设计 4.2.1 遮挡的对抗空间信息损失 4.2.2 对抗空间Transformer网络 4.2.3 对抗融合 五、实验 5.1 实验设置 5.2 PASCAL VOC…...
Laravel 实现 队列 发送邮件功能
一. 什么是队列 在构建 Web 应用程序时,你可能需要执行一些任务,例如解析文件,发送邮件,大量的数据计算等等,这些任务在典型的 Web 请求期间需要很长时间才能执行。 庆幸的是,Laravel 可以创建在后台运行…...
一、绪论(Introduction of Artificial Intelligence)
写在前面: 老师比较看重的点:对问题的概念本质的理解,不会考试一堆运算的东西,只需要将概念理解清楚就可以,最后一个题会出一个综合题,看潜力,前面的部分考的不是很深,不是很难&…...
Web攻防—SSRF服务端请求伪造Gopher伪协议无回显利用
前言 重学Top10的第二篇,希望各位大佬不要见笑。 SSRF原理 SSRF又叫服务端请求伪造,是一种由服务端发起的恶意请求,SSRF发生在应用程序允许攻击者诱使服务器向任意域或资源发送未经授权的请求时。服务器充当代理,执行攻击者构造…...
2025蓝桥杯python A组题解
真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。 题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解 队友题解 B 思路: 我…...
使用Python建模量子隧穿
引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象。在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它。但是,在量子力学中,粒子有时可以“穿越”一个势垒,即使它的能量不足以克服这个势垒。这种现象被称为“量子隧穿”。今天,我们将通过 Python 来建…...
微信小程序开发常用语法和api
vue写习惯了,小程序太久不做,一些语法和api都忘记。本文总结下小程序常用的语法和api 语法 绑定事件和传参 绑定事件还有很多,触摸反馈事件,表单事件,媒体事件后续更新细说。 <!-- 绑定事件 bindtap 事件传参 da…...
【时时三省】(C语言基础)选择结构程序综合举例
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 下面综合介绍几个包含选择结构的应用程序。 例题1: 写一程序,判断某一年是否为闰年。 程序1: 先画出判别闰年算法的流程图,见下图用变量le…...
Redis实现分布式定时任务
设计思路 任务表示:每个任务通过一个特定格式的键来表示。键名可以包含任务ID等信息,值可以是任务的具体内容或指向任务详情的引用。过期机制:利用Redis的EXPIRE命令为任务设置过期时间,当到达设定的时间点时,Redis会…...
File 类 (文件|文件夹操作)
一、File 类 1.1 前言 在 JDK 中 通过 java.io.File 类,可以实现操作系统重文件|文件夹的创建、删除、查看、重命名等操作。 1.2 File 类构造方法 File 一共提供了四个构造方法,都是有参构造。其中最常使用的是 File(String) 和 File(String, String)…...
Html页面Table表格导出导入Excel文件 xlsx.full
Html页面Table表格导出Excel文件 引用 xlsx.full.min.js 文件 导出 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.j…...
【资料分享】瑞芯微RK3576,8核2.2GHz+6T算力NPU工业核心板说明书
核心板简介 创龙科技SOM-TL3576-S是一款基于瑞芯微RK3576J/RK3576高性能处理器设计的4核ARM Cor...
埃隆·马斯克如何通过开源创新塑造未来
李升伟 编译 埃隆马斯克的名字在多个行业回响——从电动汽车、太空探索到人工智能及更多领域。虽然许多人关注他革命性的公司(如特斯拉、SpaceX、Neuralink和The Boring Company),但较少有人意识到他在开源软件运动中悄然却深远的影响力。本…...
ALOPS智能化运维管理平台
AIOps(Artificial Intelligence for IT Operations)即智能运维,是将人工智能技术应用于 IT 运维管理领域,以实现自动化、智能化的运维决策和管理。以下是关于 AIOps 的详细介绍: 核心能力 数据收集与整合:…...
Hadoop文件操作指南:深入解析文件操作
1 Hadoop文件系统概述 Hadoop分布式文件系统(HDFS)是Hadoop生态的核心存储组件,专为大规模数据集设计,具有高容错性和高吞吐量特性。 HDFS核心特性: 分布式存储:文件被分割成块(默认128MB)分布存储多副本机制:每个块默认3副本&…...
使用Fortran读取HDF5数据
使用Fortran读取HDF5数据 下面我将介绍如何在Fortran中读取HDF5文件中的各种类型数组数据,包括一维数组、二维数组、元数组和变长数组。 准备工作 首先需要确保系统安装了HDF5库,并且在编译时链接了HDF5库。例如使用gfortran编译时: gfor…...
STM32 HAL库之EXTI示例代码
外部中断按键控制LED灯 在main.c中 HAL_Init(); 初始化Flash,中断优先级以及HAL_MspInit函数,也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …...
