Posts for: #严密逻辑

微观战术剖析。深入 DDD 落地实践、高并发锁机制、JVM 性能调优、数据库索引解析与源码深度分析。

DDD 实战:聚合根设计的五条血泪教训

2023 年,我主导了一个电商中台的 DDD 重构项目。从最初的「大泥球」单体架构到最终的领域驱动设计落地,我们踩了无数的坑。这篇文章不谈理论,只讲实战中用血泪换来的五条聚合根设计教训。

背景:那个让我们失眠的订单系统

老系统是一个典型的「上帝类」架构——OrderService 有 8000 多行代码,一个 createOrder 方法就包含了库存扣减、优惠券核销、积分计算、物流单创建等 12 个领域的逻辑。任何一个小改动都可能引发蝴蝶效应。

我们决定用 DDD 重构。但理论上的 DDD 和工程实践之间的鸿沟,远比教科书中描述的要深。

教训一:聚合根不是实体,是一致性边界

最初的设计中,我们把 Order(订单)设计成了一个巨大的聚合根,里面包含了订单项、收货地址、支付信息、物流跟踪、发票信息等所有关联实体。

// 错误示范:上帝聚合根
public class Order {
    private OrderId id;
    private List<OrderItem> items;          // 订单项
    private ShippingAddress address;        // 收货地址
    private PaymentInfo payment;            // 支付信息
    private List<LogisticsRecord> logistics;// 物流跟踪
    private InvoiceInfo invoice;            // 发票信息
    private CouponUsage couponUsage;        // 优惠券使用记录
    private List<OrderRemark> remarks;      // 订单备注
    
    // 一个方法改了 7 个实体的状态...
    public void confirmOrder() {
        // 验证库存、验证地址、创建支付单、生成物流单...
    }
}

问题很快暴露了

[阅读全文]

JVM 调优手记:GC 停顿时间从 500ms 压到 20ms

线上告警:P99 延迟从 80ms 飙升至 2000ms,每隔几分钟就有一次「毛刺」。排查了三天,最终发现罪魁祸首是 GC。这是一篇完整的 JVM 调优实战记录,从问题定位到参数调优,全程复盘。

事故现场

我们的实时推荐服务部署在 8 台 16C32G 的机器上,JDK 17,堆内存配置为 -Xmx12g -Xms12g,使用 G1 垃圾回收器。日均请求量 2 亿次,单机 QPS 约 3000。

某天凌晨,监控系统突然告警:

告警指标:
- P99 延迟:80ms → 2000ms(持续波动)
- GC 暂停时间:平均 500ms,峰值 3200ms
- Full GC 频率:每 3-5 分钟一次
- CPU 使用率:从 40% 飙升至 85%

用户侧的表现是:推荐列表偶尔加载极慢,页面出现空白等待。

第一步:收集 GC 日志

开启详细 GC 日志是所有调优工作的起点:

# JDK 17 的 GC 日志参数
-Xlog:gc*:file=/data/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=50m

# 如果是 JDK 8(虽然很老了)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/gc.log

GCEasygchisto 分析日志后,问题一目了然:

[阅读全文]

RAR/ZIP 压缩包密码忘了怎么办?2026 年完整恢复指南

作为技术人员,你一定经历过这样的噩梦:几个月前加密的压缩包,密码死活想不起来了。里面可能是重要的项目资料、珍贵的照片备份、或者是离职前交接给你的技术文档。别慌,这篇文章系统梳理了当前主流的压缩包密码恢复方案。

压缩包加密的基本原理

在讨论恢复方案之前,先理解压缩包是怎么加密的。这决定了哪些恢复方案可行,哪些不可行。

ZIP 加密

ZIP 格式支持两种加密方式:

传统 ZIP 加密(ZipCrypto):
  - 基于流密码的简单加密
  - 安全性较低,存在已知的明文攻击漏洞
  - 如果压缩包内有你知道内容的文件,可以通过已知明文攻击快速破解
  - 恢复难度:★★☆☆☆

AES-256 加密(WinZip AES):
  - 基于 AES-256-CBC 的现代加密
  - 目前没有已知的密码学漏洞
  - 只能通过暴力枚举或字典攻击恢复
  - 恢复难度:★★★★☆

RAR 加密

RAR3 加密:
  - AES-128-CBC
  - 密钥派生使用 PBKDF2,但迭代次数较低
  - 恢复速度:中等

RAR5 加密:
  - AES-256-CBC
  - 密钥派生使用 PBKDF2-HMAC-SHA256,迭代次数可配置
  - 抗暴力破解能力显著增强
  - 恢复速度:较慢

关键认知:现代加密算法(AES-256)本身是无法被「破解」的。 所有恢复方案本质上都是在尝试猜测密码——通过字典攻击、暴力枚举、规则变异等方式,逐一尝试可能的密码组合。

方案一:回忆与推理(零成本,优先尝试)

在动用任何工具之前,先花 10 分钟做密码推理。很多人忽略了这一步,直接上工具,浪费了大量时间。

密码回忆清单:

1. 检查你的密码管理器
   - 1Password / Bitwarden / KeePass 中是否保存过?
   - 浏览器密码管理器中是否有记录?

2. 常见密码模式
   - 你的常用密码 + 数字后缀(如 MyPass2024)
   - 项目名称 + 特殊字符(如 Project@Arch)
   - 日期组合(如 20240101、199506)
   - 手机号、身份证号的部分数字

3. 查看历史记录
   - 邮件中是否有发送过这个压缩包?附件里可能有密码
   - 聊天记录(微信/钉钉/Slack)中是否提到过密码?
   - 笔记软件(Notion/Obsidian/备忘录)中是否有记录?

4. 询问相关人
   - 谁给你的这个压缩包?
   - 当时是在什么场景下加密的?

方案二:本地恢复工具

如果回忆无果,可以使用本地工具进行密码恢复。

[阅读全文]

Word/Excel 文档加密密码恢复:从原理到实战

前两天帮一位做财务的朋友恢复了一个加密的 Excel 文件密码——那里面存着三年的税务数据,密码忘了但文件又不能丢。Office 文档的加密机制和压缩包完全不同,恢复策略也有很大差异。这篇文章把 Office 文档密码恢复的技术原理和实战方案完整梳理一遍。

Office 文档的加密演进

Office 文档的加密方案随着版本迭代发生了很大变化。了解加密版本是选择恢复方案的前提。

Office 97-2003(.doc / .xls / .ppt):
  加密方式:RC4(40-bit 密钥)
  安全性:极弱
  恢复难度:★☆☆☆☆
  说明:40-bit 密钥空间只有 2^40 ≈ 1 万亿种组合,现代 GPU 几小时即可穷举

Office 2007(.docx / .xlsx / .pptx):
  加密方式:AES-128 + SHA-1
  密钥派生:PBKDF2,迭代 50,000 次
  安全性:中等
  恢复难度:★★★☆☆
  说明:迭代次数显著增加了暴力破解的难度

Office 2010:
  加密方式:AES-128 + SHA-1
  密钥派生:PBKDF2,迭代 100,000 次
  安全性:中等偏上
  恢复难度:★★★☆☆

Office 2013-2021 / Microsoft 365:
  加密方式:AES-256 + SHA-512
  密钥派生:PBKDF2,迭代 100,000 次(可配置到 1,000,000)
  安全性:强
  恢复难度:★★★★☆
  说明:AES-256 + 高迭代次数,对暴力破解有很强的抵抗力

查看你的文档使用的加密版本

# 使用 msoffcrypto-tool 查看加密信息
import msoffcrypto

with open('encrypted.xlsx', 'rb') as f:
    file = msoffcrypto.OfficeFile(f)
    print(f"加密类型: {file.file_type}")
    print(f"密钥大小: {file.keyTypes}")
    # 或者使用命令行:
    # msoffcrypto-tool -t encrypted.xlsx

Office 的两种「加密」:别搞混了

很多用户混淆了 Office 的两种保护机制:

[阅读全文]

PDF 文件密码忘记了?加密 PDF 恢复方案全面对比

PDF 加密比其他文件格式更「诡异」——它有用户密码和所有者密码两套机制,安全性差异巨大。上周遇到一个案例:一份加密的 PDF 合同,打不开也打印不了,折腾了一下午终于搞定了。这篇文章把 PDF 密码恢复的技术细节彻底讲清楚。

PDF 加密的两种密码

PDF 的加密机制和其他文件格式最大的不同在于:它有两种独立的密码

用户密码(User Password / Open Password):
  作用:打开文件时必须输入
  效果:文件内容被加密,没有密码无法查看
  恢复难度:取决于加密算法版本
  这是真正意义上的「加密」

所有者密码(Owner Password / Permissions Password):
  作用:限制打印、复制、编辑等操作
  效果:文件可以打开查看,但不能执行受限操作
  恢复难度:★☆☆☆☆(几乎可以秒解)
  这不是真正的加密,只是一个「限制标记」

如何判断你的 PDF 是哪种密码?

场景 1:打开 PDF 时弹出密码输入框
  → 用户密码(需要正经恢复)

场景 2:可以打开查看,但打印按钮灰色/复制文字失败
  → 所有者密码(可以轻松移除)

场景 3:既需要密码打开,又有操作限制
  → 两种密码都设置了(先恢复用户密码,再移除所有者密码)

所有者密码:秒解方案

所有者密码不加密文件内容,只是在 PDF 元数据中设置了一个权限标记。有密码可以修改权限,没密码也可以直接移除。

方法 1:Ghostscript(命令行,免费)

# 安装 Ghostscript
# macOS: brew install ghostscript
# Ubuntu: sudo apt install ghostscript

# 移除所有者密码(重新生成 PDF)
gs -q -dNOPAUSE -dBATCH \
   -sDEVICE=pdfwrite \
   -dCompatibilityLevel=1.4 \
   -sOutputFile=unlocked.pdf \
   encrypted.pdf

# 原理:Ghostscript 读取 PDF 内容后重新生成一个新的 PDF
# 新 PDF 不包含任何权限限制

方法 2:qpdf(命令行,免费)

# 安装 qpdf
# macOS: brew install qpdf
# Ubuntu: sudo apt install qpdf

# 移除所有加密
qpdf --decrypt encrypted.pdf unlocked.pdf

# 如果同时有用户密码,需要提供密码
qpdf --password=yourpassword --decrypt encrypted.pdf unlocked.pdf

方法 3:在线工具

各种在线 PDF 工具(如 ilovepdf.com、smallpdf.com)都可以一键移除所有者密码限制。原理和 Ghostscript 一样——读取内容后重新生成。

[阅读全文]

BitLocker 加密磁盘密码恢复:方案、工具与注意事项

BitLocker 是 Windows 自带的全盘加密功能,很多企业在部署笔记本时会默认开启。它的安全性远高于文件级加密——一旦密码丢失,整个磁盘的数据都不可访问。这篇文章详细梳理了 BitLocker 密码丢失后的所有恢复路径。

BitLocker 的工作原理

在讨论恢复方案之前,有必要先理解 BitLocker 的加密架构。

BitLocker 加密层次:

┌─────────────────────────────────────┐
│ 全卷加密密钥(FVK / Full Volume Key)│ ← 真正加密磁盘数据的密钥
├─────────────────────────────────────┤
│ 保护密钥(保护 FVK 的多种机制)       │
│  ├─ TPM 芯片(硬件级密钥存储)       │
│  ├─ USB 启动密钥                    │
│  ├─ 恢复密钥(48 位数字)            │
│  └─ 用户密码 / PIN                  │
├─────────────────────────────────────┤
│ AES-128 或 AES-256 全盘加密          │ ← 加密整个系统分区
└─────────────────────────────────────┘

关键理解:BitLocker 的真正密钥是 FVK(Full Volume Key)。用户密码、TPM、PIN 码等都是「保护密钥的方式」,它们的作用是保护 FVK 不被未授权访问。

这意味着 BitLocker 的恢复有两种思路:

[阅读全文]

WiFi 密码忘了怎么办?WPA2/WPA3 握手包恢复实战教程

家里换了路由器之后忘了 WiFi 密码,或者公司前任网管离职了没交接 WiFi 密码——这些场景比想象中更常见。这篇文章从技术角度讲解 WiFi 密码的加密原理和恢复方案,同时也会谈谈 WPA3 带来的安全改进。

WiFi 加密协议演进

WiFi 安全协议时间线:

WEP (1997)      → 已被完全破解,几分钟即可恢复密钥
WPA (2003)      → TKIP 加密,存在已知漏洞
WPA2 (2004)     → AES-CCMP,目前主流,安全性较高
WPA3 (2018)     → SAE 握手,抗离线字典攻击

WPA2 的认证机制:四次握手

WPA2 使用「四次握手」(4-Way Handshake)来验证客户端和路由器是否知道相同的密码:

WPA2 四次握手流程:

    路由器 (AP)                          客户端 (Client)
       │                                      │
       │  ── 1. ANonce (随机数) ──────────→   │
       │                                      │
       │  ←── 2. SNonce + MIC ─────────────   │
       │     (客户端的随机数 + 消息完整性校验)   │
       │                                      │
       │  ── 3. GTK + MIC ────────────────→   │
       │     (组密钥 + 确认)                    │
       │                                      │
       │  ←── 4. 确认 ─────────────────────   │
       │                                      │

关键点:
  - 密码本身不在网络上传输
  - 握手过程使用密码派生的 PMK (Pairwise Master Key) 来生成加密密钥
  - PMK = PBKDF2(密码, SSID, 4096, 256)
  - 攻击者可以捕获握手包,然后离线尝试猜测密码

为什么 WPA2 可以被离线恢复?

WPA2 的安全模型:

PMK = PBKDF2(HMAC-SHA1, 密码, SSID, 4096, 256位)
       ↑                    ↑      ↑
       密码学哈希函数        WiFi名  迭代次数

PMK 是固定的(同一个密码 + 同一个 SSID = 同一个 PMK)
四次握手中的 Nonce 是随机的

攻击者的思路:
  1. 捕获一次完整的四次握手包
  2. 离线计算:对每个候选密码,计算 PMK,然后验证是否能生成正确的 MIC
  3. 如果 MIC 匹配 → 密码正确

这就是为什么只需要捕获一次握手包,就可以无限次地离线尝试密码

第一步:捕获握手包

要恢复 WiFi 密码,首先需要捕获一次完整的四次握手。

[阅读全文]