目录
项目简介
John the Ripper(简称 John)是一个快速密码破解工具,用于检测弱密码。它支持多种密码哈希类型,包括 Unix crypt、Kerberos、Windows LM 哈希等,以及数百种额外的哈希和密码算法(在 “jumbo” 版本中)。
仓库地址: git@gitcode.com:nutpi/john.git
版本: v1.0.0
Tag: 1.0.0_ohos
John the Ripper 是什么
John the Ripper 是一个密码破解工具,主要用于检测弱密码。它支持多种密码哈希类型,可以用于安全审计、密码恢复等场景。
主要优势
- 快速破解:优化的算法,破解速度快
- 多种哈希支持:支持数百种密码哈希类型
- 可扩展:支持自定义哈希算法和破解模式
- 跨平台:支持多种操作系统
应用场景
- 安全审计:检测系统中的弱密码
- 密码恢复:恢复忘记的密码(需要合法授权)
- 安全研究:研究密码安全性
- 渗透测试:评估系统安全性
John the Ripper 的主要特性
1. 多种哈希支持
- Unix crypt(DES、MD5、Blowfish、SHA-256、SHA-512)
- Kerberos/AFS 哈希
- Windows LM 和 NTLM 哈希
- 数百种额外的哈希类型(jumbo 版本)
2. 破解模式
- 字典模式:使用字典文件破解
- 暴力破解:尝试所有可能的密码组合
- 混合模式:结合字典和规则
- 增量模式:逐步增加密码长度
3. 性能优化
- 多线程支持
- GPU 加速(某些哈希类型)
- 优化的算法实现
John the Ripper 的使用方法
基本用法
# 破解密码文件
john password.txt
# 使用字典文件
john --wordlist=dictionary.txt password.txt
# 显示破解结果
john --show password.txt
# 使用特定格式
john --format=md5crypt password.txt
常用选项
破解选项
# 指定字典文件
john --wordlist=dictionary.txt password.txt
# 指定规则文件
john --rules=password.rules password.txt
# 指定格式
john --format=md5crypt password.txt
# 显示进度
john --status password.txt
输出选项
# 显示破解结果
john --show password.txt
# 显示所有密码(包括未破解的)
john --show --users=all password.txt
# 保存会话
john --session=mysession password.txt
HarmonyOS 适配过程
项目特点
John the Ripper 使用 Autotools(autoconf、automake)作为构建系统,构建系统位于 src 目录下。项目支持禁用 OpenSSL,使用内置的加密实现。
适配挑战
- 构建系统位置:构建系统在
src目录下 - autoconfig.h 生成:
autoconfig.h生成问题 - OpenSSL 依赖:可以选择禁用 OpenSSL
- 交叉编译配置:需要正确配置目标平台和工具链
环境准备
1. 系统要求
- macOS(本文示例)或 Linux
- Autotools(autoconf、automake、libtool)
- HarmonyOS SDK
- Python 3(用于构建脚本)
2. 安装 Autotools
# macOS (使用 Homebrew)
brew install autoconf automake libtool
# Linux (Ubuntu/Debian)
sudo apt-get install autoconf automake libtool
构建脚本详解
build_ohos.sh 关键代码
export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/john.org/john_1.0.0
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
# 进入 src 目录
cd src
# 清理之前的构建
make clean 2>/dev/null || true
rm -rf autom4te.cache config.cache config.status config.log Makefile autoconfig.h
# 如果 configure 脚本不存在,需要运行 autoreconf
if [ ! -f configure ]; then
autoreconf -i
fi
# 确保 autoconfig.h.in 存在
if [ ! -f autoconfig.h.in ]; then
autoheader
fi
# 配置构建
CPP_VAR="${CC} -E"
./configure \
--host=aarch64-linux-musl \
--prefix=${TREE_INSTALL_HNP_PATH}/usr \
CC="${CC}" \
CFLAGS="${CFLAGS}" \
CPP="${CPP_VAR}" \
CXX="${CXX}" \
CXXFLAGS="${CXXFLAGS}" \
LDFLAGS="${LDFLAGS}" \
--disable-pkg-config \
--without-openssl
# 确保 autoconfig.h 被生成
if [ -f config.status ]; then
rm -f autoconfig.h autoconfig.h.stamp
./config.status 2>&1 | grep -v "is unchanged" || true
# 如果仍然不存在,从 autoconfig.h.in 创建
if [ ! -f autoconfig.h ]; then
cp autoconfig.h.in autoconfig.h
# 替换模板变量
sed -i '' \
-e "s/@ARCH_BITS@/64/g" \
-e "s/@ARCH_LITTLE_ENDIAN@/1/g" \
autoconfig.h
# 修复 #undef 行为 #define
sed -i '' \
-e "s|^#undef ARCH_LITTLE_ENDIAN$|#define ARCH_LITTLE_ENDIAN 1|g" \
autoconfig.h
fi
fi
# 构建
make -j$(sysctl -n hw.ncpu 2>/dev/null || echo 4) VERBOSE=1
# 安装
export DESTDIR=${TREE_INSTALL_HNP_PATH}
export prefix=/usr
make install
脚本关键点解析
1. 进入 src 目录
cd src
作用:John the Ripper 的构建系统在 src 目录下,需要先进入该目录。
2. autoconfig.h.in 生成
if [ ! -f autoconfig.h.in ]; then
autoheader
fi
作用:确保 autoconfig.h.in 存在,这是生成 autoconfig.h 的模板文件。
3. autoconfig.h 生成
# 从 autoconfig.h.in 创建 autoconfig.h
cp autoconfig.h.in autoconfig.h
# 替换模板变量
sed -i '' -e "s/@ARCH_BITS@/64/g" autoconfig.h
# 修复 #undef 行为 #define
sed -i '' -e "s|^#undef ARCH_LITTLE_ENDIAN$|#define ARCH_LITTLE_ENDIAN 1|g" autoconfig.h
作用:确保 autoconfig.h 存在并包含必要的定义。
4. 禁用 OpenSSL
--without-openssl
作用:禁用 OpenSSL 依赖,使用内置的加密实现。
关键问题解决
问题 1:构建系统位置错误
错误信息:
make: *** No rule to make target `clean'. Stop.
原因:John the Ripper 的构建系统在 src 目录下,需要在 src 目录中运行构建命令。
解决方案:先进入 src 目录,然后运行构建命令。
问题 2:autoconfig.h 生成问题
错误信息:
fatal error: 'autoconfig.h' file not found
原因:config.status 可能没有正确生成 autoconfig.h。
解决方案:
- 从
autoconfig.h.in手动创建autoconfig.h - 替换模板变量为实际值
- 修复
#undef行为#define
问题 3:OpenSSL 依赖问题
错误信息:
error: OpenSSL not found
原因:John the Ripper 默认需要 OpenSSL 库。
解决方案:使用 --without-openssl 选项,禁用 OpenSSL 依赖。
autoconfig.h 生成问题
问题分析
autoconfig.h 是 Autotools 生成的头文件,包含架构特定的配置定义。在交叉编译时,config.status 可能无法正确生成 autoconfig.h。
解决方案
方法 1:从 autoconfig.h.in 创建
# 从 autoconfig.h.in 创建 autoconfig.h
cp autoconfig.h.in autoconfig.h
# 替换模板变量
sed -i '' \
-e "s/@ARCH_BITS@/64/g" \
-e "s/@ARCH_BITS_LOG@/6/g" \
-e "s/@ARCH_BITS_STR@/\"64\"/g" \
-e "s/@ARCH_SIZE@/8/g" \
-e "s/@ARCH_WORD@/unsigned long/g" \
-e "s/@ARCH_LITTLE_ENDIAN@/1/g" \
-e "s/@HAVE_LIBCRYPTO@/0/g" \
autoconfig.h
方法 2:修复 #undef 行
# 修复 #undef 行为 #define
sed -i '' \
-e "s|^#undef ARCH_LITTLE_ENDIAN$|#define ARCH_LITTLE_ENDIAN 1|g" \
-e "s|^#undef HAVE_LIBCRYPTO$|#define HAVE_LIBCRYPTO 0|g" \
-e "s|^#undef ARCH_ALLOWS_UNALIGNED$|#define ARCH_ALLOWS_UNALIGNED 1|g" \
autoconfig.h
OpenSSL 依赖问题
问题分析
John the Ripper 默认需要 OpenSSL 库来支持某些哈希类型。在交叉编译时,很难找到或配置正确的 OpenSSL 库。
解决方案
使用 --without-openssl 选项,禁用 OpenSSL 依赖:
./configure --without-openssl
影响:
- ✅ 避免了 OpenSSL 交叉编译的复杂性
- ✅ 简化了构建过程
- ❌ 某些需要 OpenSSL 的哈希类型可能不可用
HNP 包配置
hnp.json
{
"type":"hnp-config",
"name":"john",
"version":"1.0.0",
"install":{}
}
安装目录结构
john_1.0.0/
├── usr/
│ ├── bin/
│ │ └── john # 可执行文件
│ └── share/
│ └── man/
│ └── man1/
│ └── john.1 # 用户手册
└── hnp.json # HNP 包配置
构建结果
构建成功后,会生成以下文件:
- HNP 包:
john.org_john_1.0.0.hnp - Tar 归档:
ohos_john_1.0.0.tar.gz
构建输出示例
==========================================
Build completed successfully!
==========================================
HNP Package: /path/to/archive/john.org_john_1.0.0.hnp
Tar Archive: /path/to/archive/ohos_john_1.0.0.tar.gz
Installation Path: /path/to/data/service/hnp/john.org/john_1.0.0
==========================================
使用示例
在 HarmonyOS 上使用 John the Ripper
安装 HNP 包后,可以在 HarmonyOS 设备上使用 John:
# 破解密码文件
john password.txt
# 使用字典文件
john --wordlist=dictionary.txt password.txt
# 显示破解结果
john --show password.txt
# 使用特定格式
john --format=md5crypt password.txt
总结
适配要点
- 构建系统位置:构建系统在
src目录下 - autoconfig.h 处理:确保
autoconfig.h正确生成和修复 - OpenSSL 禁用:使用
--without-openssl选项,避免 OpenSSL 依赖 - 配置修复:修复
autoconfig.h中的#undef行
关键决策
- 禁用 OpenSSL:简化交叉编译过程
- 手动生成 autoconfig.h:提供回退方法创建和修复 autoconfig.h
- 模板变量替换:从
autoconfig.h.in创建autoconfig.h并替换模板变量
FAQ
Q1: 为什么构建系统在 src 目录下?
A: John the Ripper 的构建系统位于 src 目录下,这是项目的设计。需要在 src 目录中运行构建命令。
Q2: 为什么需要禁用 OpenSSL?
A: 在交叉编译时,很难找到或配置正确的 OpenSSL 库。禁用 OpenSSL 可以简化构建过程,虽然某些哈希类型可能不可用。
Q3: 如何验证构建的二进制文件?
A: 可以使用 file 命令检查:
file john
应该显示类似:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), ...
Q4: 禁用 OpenSSL 会影响功能吗?
A: 禁用 OpenSSL 后,某些需要 OpenSSL 的哈希类型可能不可用,但大多数常见的哈希类型仍然可用。
459

被折叠的 条评论
为什么被折叠?



