在使用 John the Ripper以下简称 John破解密码哈希时你可能会遇到这样的情况John 自动检测不到哈希类型或者报错说找不到对应的格式插件。这时候一个万能兜底的参数就能派上用场——--formatcrypt。加上--formatcrypt就是告诉 John“别自己折腾了直接让操作系统来帮你算这个哈希。”1. 背景crypt(3)是什么在 Unix/Linux 系统中crypt是一个标准的 C 语言库函数专门负责密码哈希的计算。当你登录 Linux 系统时系统就是调用crypt()来对比你输入的密码和/etc/shadow里存储的哈希值。现代 Linux 发行版如 Kali的libcrypt库已经内置了对多种算法的支持MD5、SHA-256、SHA-512、以及较新的yescrypt等。换句话说只要你的系统能正常登录它的crypt()函数就一定能识别并计算这个哈希。2. John 的两种工作模式John 破解哈希时本质上走了两条不同的路路径 A原生模式Native Formats这是 John 的高性能模式。John 内部针对各种哈希算法如sha512crypt、md5crypt写了高度优化的 C/汇编代码甚至利用了 SIMD 指令集AVX、SSE 等来加速。优点速度极快资源利用率高。缺点只有 John 代码库里实现了的算法才能用。如果某种新算法如 yescrypt还没被 John 原生支持这条路就走不通。路径 BCrypt 模式--formatcrypt这是 John 的兼容模式。John 不再用自己的代码计算哈希而是充当一个搬运工从字典里读出一个候选密码如password123把这个密码丢给操作系统的crypt()函数crypt()返回计算结果John 拿这个结果去和待破解的哈希对比优点兼容一切。只要系统libcrypt能识别的哈希John 就能破。缺点速度较慢因为每次都要进行系统库调用无法做底层优化。3. 为什么要手动指定--formatcrypt以yescrypt哈希前缀为$y$为例yescrypt 是较新的密码哈希算法被现代 Debian/Ubuntu/Kali 系统默认采用。并不是所有版本的 John 都内置了 yescrypt 的原生优化代码。但你的 Kali 系统本身能识别 yescrypt否则你无法登录系统。所以当 John 的自动检测失败或者没有原生插件支持时手动指定--formatcrypt就是强制 John 走系统接口实现曲线救国。本质上是绕过 John 的自动检测逻辑告诉它“别猜了直接用系统自带的方法去跑这个哈希。”4. 两种模式对比特性原生模式如--formatsha512cryptCrypt 模式--formatcrypt速度极快汇编/SIMD 深度优化较慢受限于系统库调用开销支持范围仅限 John 代码库已有的算法极广系统能识别的都能破资源占用优化得当CPU 利用率高相对较低调用外部库适用场景已知算法、追求速度未知/新算法、兼容兜底5. 实际使用示例假设你有一个 yescrypt 哈希# 自动检测失败john hash.txt# 强制使用系统 crypt() 接口john--formatcrypt hash.txt /usr/share/wordlists/rockyou.txt总结--formatcrypt是 John the Ripper 的万能钥匙。它牺牲了一定的性能换来了极致的兼容性。当你面对一个新系统、新算法或者 John 自动检测失灵时这个参数能确保你稳住局面——毕竟系统自己能登录的密码它的crypt()函数就一定能算出来。快选原生稳选 crypt。