从哈希原理到实战:掌握Hashcat密码恢复工具的核心攻防技术
在网络安全领域密码安全是防御体系的第一道关卡。无论是渗透测试中的授权评估还是企业安全团队进行内部防护能力验证理解密码破解的原理与工具都是至关重要的技能。Hashcat作为业界公认的速度最快、功能最全的高级密码恢复工具是安全研究人员、渗透测试工程师和CTF选手必须掌握的利器。本文将从零开始系统性地讲解Hashcat的核心原理、环境搭建、攻击模式实战并深入探讨其背后的密码学知识、防御策略以及合法合规的使用边界。通过本文你将能掌握Hashcat从基础到进阶的完整使用流程理解密码破解的攻防逻辑并建立起在合法授权范围内进行安全测试的完整知识框架。1. 密码破解基础与Hashcat核心概念在深入工具使用之前我们必须建立正确的认知基础。密码破解并非简单的“猜密码”而是一个涉及密码学、计算资源和策略的复杂过程。1.1 什么是哈希Hash与密码存储现代系统几乎从不以明文形式存储用户密码。当你在网站或系统注册时你输入的密码会经过一个哈希函数的处理生成一串固定长度的、看似随机的字符串这串字符就是哈希值。这个过程是单向的理论上无法从哈希值反推出原始密码。常见的哈希算法包括MD5: 已被证实存在碰撞漏洞不再安全但仍广泛存在于旧系统中。SHA-1: 同样存在安全性问题不推荐用于密码存储。SHA-256/SHA-512: 目前常用的安全哈希算法。bcrypt, scrypt, Argon2: 专门为密码存储设计的“慢哈希”函数内置了成本因子工作因子能有效抵御暴力破解。系统在验证密码时会将你再次输入的密码进行相同的哈希计算然后比对计算出的哈希值与数据库中存储的哈希值是否一致。因此所谓的“密码破解”在技术层面上是尝试找到能生成目标哈希值的那个原始输入即密码的过程。1.2 Hashcat是什么及其定位Hashcat不是一个直接“破解”系统或网站的工具它是一个离线密码恢复工具。它的工作前提是你已经通过某种授权方式如从数据库导出、从内存dump、从网络抓包获得哈希包获取到了目标的密码哈希值。Hashcat的任务是利用CPU、GPU、甚至FPGA等计算资源以极高的速度尝试海量的候选密码计算其哈希值并与目标哈希进行比对。其核心优势在于多算法支持支持超过300种哈希算法的破解包括常见的MD5、SHA家族、Windows的NTLM/LM哈希、Unix的crypt系列、以及各种应用特定哈希如MySQL、Cisco类型。多种攻击模式提供暴力破解、字典攻击、组合攻击、规则攻击、混合攻击等多种策略适应不同场景。极致性能充分利用多核CPU、多GPU的并行计算能力通过高度优化的内核实现极快的哈希计算速度。跨平台支持Windows、Linux、macOS。1.3 合法合规的使用场景这是最重要的部分。使用Hashcat必须严格遵循法律法规和道德准则。渗透测试与安全评估在获得目标系统所有者明确书面授权的前提下对系统密码强度进行测试。取证调查执法部门或授权的安全团队在调查案件时对依法获取的电子设备中的加密数据进行解密。个人数据恢复忘记了自己加密文件、压缩包的密码且该数据为你本人所有。教育与研究在隔离的实验室环境中用于学习密码学、安全攻防技术。绝对禁止在未授权的情况下对任何不属于你或你未获得明确测试许可的系统、网络、数据进行密码破解尝试这属于违法行为。2. 环境准备与Hashcat安装工欲善其事必先利其器。Hashcat的性能严重依赖硬件尤其是GPU。2.1 硬件与系统要求操作系统推荐使用Kali Linux、Parrot OS等渗透测试专用发行版它们预装了Hashcat及大量字典。Windows和macOS也可运行。CPU现代多核处理器即可。GPU关键这是Hashcat的“发动机”。NVIDIA GPU需安装CUDA驱动和AMD GPU需安装ROCm或OpenCL驱动都能提供远超CPU的破解速度。显存越大能同时处理的哈希和字典数据越多。驱动确保安装了最新的显卡驱动和对应的计算平台CUDA或OpenCL。2.2 在Kali Linux中安装与验证Kali Linux通常预装了Hashcat。可以通过以下命令验证和更新# 查看是否已安装及版本 hashcat --version # 如果未安装使用apt安装 sudo apt update sudo apt install hashcat hashcat-utils -y # 更新到最新版本如果仓库版本较旧 sudo apt upgrade hashcat2.3 在Windows中安装从Hashcat官网下载最新的二进制发布包。解压到任意目录例如C:\hashcat。打开命令提示符CMD或PowerShell导航到该目录。需要额外安装显卡厂商的运行时库如NVIDIA的CUDA Toolkit或AMD的APP SDK。2.4 基本命令验证安装后运行帮助命令查看是否正常hashcat --help这会输出一个非常长的帮助信息包含所有参数、支持的哈希模式-m和攻击模式-a列表。3. Hashcat核心攻击模式详解理解攻击模式是高效使用Hashcat的关键。每种模式对应不同的密码猜测策略。3.1 攻击模式 (-a 参数)-a 0 字典攻击 (Straight)最常用、最高效的模式。使用一个预先准备好的密码字典文件逐行读取候选密码进行尝试。成功率取决于字典的质量和目标密码的复杂度。hashcat -m 0 -a 0 target_hashes.txt rockyou.txt # -m 0 指定哈希类型为MD5 # -a 0 字典攻击 # target_hashes.txt 包含目标哈希值的文件 # rockyou.txt 字典文件-a 1 组合攻击 (Combination)将两个字典中的词进行组合。例如字典A有pass字典B有123、!则尝试pass123、pass!。hashcat -m 0 -a 1 target_hashes.txt dict1.txt dict2.txt-a 3 掩码攻击/暴力破解 (Brute-Force/Mask)当你知道密码的部分格式例如知道以Admin开头后跟4位数字时使用。它通过定义字符集和位置来大幅缩小尝试空间比纯暴力破解高效得多。hashcat -m 0 -a 3 target_hashes.txt Admin?d?d?d?d # ?d 代表数字 (0-9) # 这个掩码会尝试 Admin0000 到 Admin9999-a 6 字典掩码攻击 (Hybrid Wordlist Mask)在字典中每个词的后面附加一个掩码。hashcat -m 0 -a 6 target_hashes.txt rockyou.txt ?d?d?d # 尝试字典中每个密码后面加上3位数字如 password123, hello456-a 7 掩码字典攻击 (Hybrid Mask Wordlist)在掩码前面加上字典中的每个词。hashcat -m 0 -a 7 target_hashes.txt ?d?d?d rockyou.txt # 尝试3位数字后面加上字典中的词如 123password, 456hello3.2 规则攻击 (-r 参数)字典的威力倍增器规则攻击不是独立的攻击模式而是与字典攻击-a 0结合使用的强大功能。它通过对字典中的基础词进行一系列变换如大小写转换、添加后缀/前缀、字符替换、颠倒顺序等生成大量变体从而用一个较小的基础字典覆盖更大的密码可能性空间。Hashcat自带丰富的规则集位于rules目录下。hashcat -m 0 -a 0 target_hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule # 使用 best64.rule 规则文件对 rockyou.txt 中的每个密码进行变换后再尝试3.3 哈希类型识别 (-m 参数)你必须告诉Hashcat目标哈希的算法类型。使用hashcat --help查看完整的-m编号列表。常见的有-m 0: MD5-m 1000: NTLM (Windows)-m 1800: sha512crypt$6$, SHA512(Unix)-m 3200: bcrypt$2*$, Blowfish(Unix)-m 5500: NetNTLMv1 / NetNTLMv1ESS-m 5600: NetNTLMv2如果不确定哈希类型可以尝试使用hashcat --identify功能或使用hash-identifierKali自带等工具进行识别。4. 完整实战案例从获取哈希到破解我们以一个完整的、在本地虚拟实验环境中的MD5密码破解为例演示全流程。4.1 实验环境与目标设置系统Kali Linux 2024.1目标我们自行生成几个MD5哈希值作为“目标”。字典使用Kali自带的经典弱密码字典rockyou.txt位于/usr/share/wordlists/。首先我们创建目标哈希文件target_hashes.txt。假设我们知道明文的密码是password123、hello2024和Admin123。# 使用 echo 和 md5sum 生成MD5哈希 (注意echo默认会加换行符影响哈希值) echo -n password123 | md5sum | awk {print $1} target_hashes.txt echo -n hello2024 | md5sum | awk {print $1} target_hashes.txt echo -n Admin123 | md5sum | awk {print $1} target_hashes.txt # 查看生成的哈希文件 cat target_hashes.txt # 输出可能类似 # 482c811da5d5b4bc6d497ffa98491e38 # 1a79f8f5c1b3c3c3d4f4f4e4b4b4b4b4 (示例非真实) # 450d7c1e3e5b7a7a7a7a7a7a7a7a7a7a注意echo -n确保不添加换行符这是正确的MD5计算方式。4.2 执行字典攻击 (-a 0)现在我们使用rockyou.txt字典来尝试破解这些哈希。hashcat -m 0 -a 0 target_hashes.txt /usr/share/wordlists/rockyou.txt -o cracked_passwords.txt-m 0: 指定哈希类型为MD5。-a 0: 使用字典攻击。-o cracked_passwords.txt: 将破解成功的“哈希:明文”对输出到指定文件。运行后Hashcat会开始工作在终端显示当前状态、速度、进度和预计剩余时间。由于password123和hello2024极有可能存在于rockyou.txt这个大型弱密码字典中它们应该会被快速破解。4.3 查看破解结果攻击完成后查看结果文件cat cracked_passwords.txt输出格式为哈希值:明文密码例如482c811da5d5b4bc6d497ffa98491e38:password123 1a79f8f5c1b3c3c3d4f4f4e4b4b4b4b4:hello2024你会发现Admin123可能没有被破解因为它不够常见可能不在rockyou.txt中。4.4 进阶尝试规则攻击针对未破解的Admin123我们可以尝试使用规则攻击对字典进行变换。# 先清理之前的破解记录以便重新尝试或使用 --remove 参数 hashcat -m 0 -a 0 target_hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/rockyou-30000.rule -o cracked_rules.txt这条命令使用rockyou-30000.rule规则它能对字典中的基础词进行数万种常见变换大大增加命中复杂密码如基础词后加数字、符号、大小写变换的概率。4.5 使用掩码攻击 (-a 3)如果我们通过信息收集推测Admin123的格式是“首字母大写的单词3位数字”我们可以尝试掩码攻击。# 假设我们知道单词部分是 “Admin”后面是 “” 符号和3位数字 hashcat -m 0 -a 3 target_hashes.txt Admin?d?d?d这个掩码空间只有1000种可能Admin000到Admin999会瞬间完成。如果密码确实是Admin123则会被破解。5. 常见问题与排查思路 (FAQ)在实际使用中你会遇到各种问题。以下是一些常见问题及解决方法。问题现象可能原因解决思路hashcat: No devices found/left.1. 显卡驱动未安装或安装不正确。2. Hashcat不支持你的集成显卡。3. 在虚拟机中运行未正确直通GPU。1. 在Linux下安装nvidia-cuda-toolkit或rocm。运行hashcat -I查看检测到的设备。2. 尝试使用CPU模式运行hashcat -D 1 -m 0 ...(-D 1指定使用CPU)。3. 对于虚拟机考虑使用物理机或配置GPU直通。ERROR: hash-mode 1000 is not supported on device 1当前选择的哈希算法 (-m参数) 在你的设备特别是GPU上不受支持。1. 更新Hashcat到最新版本。2. 查看帮助 (hashcat --help) 确认该哈希模式是否被支持。3. 使用--force参数强制在CPU上运行不推荐慢。破解速度远低于预期1. 字典文件太大I/O成为瓶颈。2. 哈希算法本身很慢如bcrypt。3. 系统资源内存、显存不足。4. 使用了低效的攻击模式或掩码。1. 使用更精炼的字典或使用规则攻击从中小字典生成变体。2. 对于慢哈希考虑使用更大的字典或更精准的掩码纯暴力破解几乎不可行。3. 监控系统资源使用情况。4. 优化掩码利用已知信息减少搜索空间。Status...........: Exhausted当前攻击模式下的所有可能性都已尝试完毕未找到匹配的密码。1. 尝试其他攻击模式如从-a 0 切换到 -a 3 并设计新掩码。2. 使用更大、更全的字典文件。3. 结合规则攻击 (-r)。4. 重新评估目标哈希类型 (-m) 是否正确。恢复会话后进度丢失会话文件 (hashcat.potfile或恢复文件) 损坏或路径不对。1. 使用--session 名参数为任务命名便于恢复。2. 恢复时使用--restore参数。3. 定期备份~/.hashcat/hashcat.potfile文件。破解出的密码是乱码或非预期字符1. 字典文件编码问题如包含BOM的UTF-8。2. 哈希值本身对应的可能就是非打印字符或二进制数据。1. 将字典文件转换为UTF-8无BOM格式。在Linux下可使用iconv或dos2unix。2. 检查哈希来源是否正确可能是文件哈希而非密码哈希。6. 最佳实践与工程化建议将Hashcat用于授权的安全测试时遵循以下最佳实践能提升效率并降低风险。6.1 字典管理与优化字典是字典攻击的灵魂。不要只依赖一个rockyou.txt。分层使用字典建立自己的字典策略。先使用小型、高效的“快速字典”如top10k.txt进行初步尝试再使用大型通用字典最后使用针对目标定制的字典如公司名、产品名、本地俚语组合。生成定制字典使用crunch、cewl爬取网站生成字典或hashcat-utils中的工具如combinator根据目标信息生成专属字典。字典去重与排序使用sort -u对字典去重并按长度或常见度排序可以提高I/O效率。6.2 攻击策略规划不要一上来就无脑跑大型字典或全字符集暴力破解。信息收集优先尽可能收集目标信息用户名、生日、公司名、常用规则用于构建掩码和定制字典。先易后难第一步使用-a 0配合顶级弱密码字典如rockyou.txt。第二步使用-a 0配合规则如best64.rule,d3ad0ne.rule。第三步基于收集的信息进行针对性的掩码攻击 (-a 3) 或混合攻击 (-a 6,-a 7)。第四步如果密码策略已知进行基于策略的暴力破解但需评估时间成本。利用硬件特性使用-w参数调整工作负载强度。在破解不影响其他工作时可以设为-w 4以获取最大性能。6.3 会话管理与分布式破解对于耗时很长的任务良好的会话管理至关重要。# 启动一个命名会话 hashcat -m 1000 -a 0 ntlm_hashes.txt big_dict.txt -o results.txt --session my_corp_audit # 如果任务中断可以这样恢复 hashcat --session my_corp_audit --restore # 查看会话状态 hashcat --session my_corp_audit --status对于超大型任务可以考虑分布式破解使用--potfile-disable和--outfile-format参数协调多台机器的工作最后合并结果。6.4 密码安全性启示防御视角作为防御者从Hashcat的攻击方式中我们可以得出强化密码策略的启示强制使用慢哈希算法在系统开发中使用bcrypt、scrypt、Argon2等设计用于密码存储的、可调节成本因子的慢哈希函数。增加密码复杂度要求要求足够长度12位以上、混合大小写字母、数字和符号。但这可能导致用户使用可预测的替换模式如Pssw0rd因此需要结合其他措施。实施密码黑名单禁止使用已知的弱密码、常见词汇和与用户个人信息强相关的密码。加盐Salt确保每个密码都有唯一、随机的盐值与之一起哈希。这使得预先计算好的彩虹表完全失效攻击者必须为每个用户单独计算。多因素认证MFA这是最有效的防御手段之一。即使密码被破解没有第二因素如手机验证码、硬件密钥也无法登录。账户锁定与监控对连续失败的登录尝试进行临时锁定并告警异常登录行为。掌握Hashcat等工具的核心价值不仅在于“攻”更在于深刻理解“防”。通过模拟攻击者的思路和方法安全人员能更有效地评估自身系统的密码策略强度发现潜在风险从而构建更稳固的安全防线。所有的技术学习与实践都必须在法律与道德的框架内进行用于保护而非破坏。建议在隔离的虚拟化实验室中如使用VirtualBox/VMware搭建的靶机进行所有练习确保技能提升的同时不触碰法律红线。

相关新闻

ZINC15数据库高效下载与处理指南:从虚拟筛选到AI训练的数据获取实战

ZINC15数据库高效下载与处理指南:从虚拟筛选到AI训练的数据获取实战

1. 项目概述:为什么我们需要ZINC15? 如果你正在做药物发现、计算化学或者机器学习模型训练,那你一定绕不开一个核心问题:数据从哪里来?高质量的、结构化的、可批量获取的小分子数据集是这一切的起点。几年前&#xff0…

2026/10/17 4:13:50 阅读更多 →
Bazzite游戏系统终极指南:从桌面到掌机的完整Linux游戏解决方案

Bazzite游戏系统终极指南:从桌面到掌机的完整Linux游戏解决方案

Bazzite游戏系统终极指南:从桌面到掌机的完整Linux游戏解决方案 【免费下载链接】bazzite Bazzite makes gaming and everyday use smoother and simpler across desktop PCs, handhelds, tablets, and home theater PCs. 项目地址: https://gitcode.com/gh_mirro…

2026/10/18 10:28:01 阅读更多 →
如何快速部署AI代理系统:面向生产环境的完整异步代理工作流方案

如何快速部署AI代理系统:面向生产环境的完整异步代理工作流方案

如何快速部署AI代理系统:面向生产环境的完整异步代理工作流方案 【免费下载链接】pi-subagents Pi extension for async subagent delegation with truncation, artifacts, and session sharing 项目地址: https://gitcode.com/GitHub_Trending/pi/pi-subagents …

2026/10/18 13:21:45 阅读更多 →

最新新闻

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南 2026年9月,开源AI视频生成模型已经形成完整梯队。本文横向对比5大可本地部署模型的核心参数、显存需求和实测速度,给出不同显卡的选型建议。文末附工作流模板和模型资源网盘链…

2026/10/18 15:53:16 阅读更多 →
pytest-django接入CI/CD全流程实战指南

pytest-django接入CI/CD全流程实战指南

两年多的时间里,我前后经手了三四个Django项目,每个项目走到后期都会遇到同一个尴尬:本地跑测试一片绿,合并代码进主干就翻车。最后定位下来,问题几乎都出在“测试只在本地跑过”这件事上。很多团队不是不想做自动化测…

2026/10/18 15:53:16 阅读更多 →
接口测试实战指南:从用例设计到自动化落地全梳理

接口测试实战指南:从用例设计到自动化落地全梳理

接口测试这东西,说实话,很多团队是"看起来在做,实际上没做透"。我在日常的测试工作里见过太多这样的情况:UI 测了半天,结果是前端把后端返回的错误信息包了一层好看的弹窗,接口本身返回 500 都没…

2026/10/18 15:53:16 阅读更多 →
spline-3d-integration - COMMON_PROBLEMS

spline-3d-integration - COMMON_PROBLEMS

常见问题与调试 这些是集成后才会浮出水面的实际问题。在完成任何 Spline 实现之前请阅读此内容。🚨 关键陷阱(会让你的网站崩溃)1. 滚动劫持 — 页面无法滚动 现象: 添加 Spline 后,整个页面停止滚动。用户被卡住。 原…

2026/10/18 15:53:16 阅读更多 →
spline-3d-integration - SKILL

spline-3d-integration - SKILL

name: spline-3d-integration description: “Use when adding interactive 3D scenes from Spline.design to web projects, including React embedding and runtime control API.” risk: safe source: community date_added: “2026-03-07” Spline 3D 集成技能 将 Spline…

2026/10/18 15:53:16 阅读更多 →
Python单元测试实战:pytest、fixture、mock与覆盖率全解析

Python单元测试实战:pytest、fixture、mock与覆盖率全解析

1. 为什么Python项目一定要补上单元测试1.1 它到底解决什么问题写到单元测试,我先说一个很实在的场景。某次我给一个内部数据处理服务加新功能,改完一个解析函数,自测时充分信心满满,结果上线当天就被日志里的报错打脸——一个我完…

2026/10/18 15:52:16 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →