从零构建Hypatia签名数据库:威胁情报采集到Bloom库生成的完整开发者指南
从零构建Hypatia签名数据库威胁情报采集到Bloom库生成的完整开发者指南【免费下载链接】HypatiaA realtime malware scanner项目地址: https://gitcode.com/gh_mirrors/hyp/HypatiaHypatia 是全球首个开源的 Android 恶意软件扫描器它的核心是一套 ClamAV 风格的签名数据库。本文带你完整走一遍 Hypatia 签名数据库的构建流程从威胁情报采集、哈希清洗归一到用 Guava BloomFilter 生成四个离线扫描库最后打包发布。哪怕你是第一次接触恶意软件检测也能跟着做。️为什么要自己构建一套签名数据库Hypatia 的扫描发生在手机本地文件哈希在设备上一遍算完MD5/SHA-1/SHA-256再和 Bloom 库做 O(k) 级别的存在性判断文件永远不会离开你的手机只在联网时下载签名库本身。这就意味着签名数据库是整套系统的心脏。它由维护者在服务器端离线生成流程非常清晰威胁情报采集 → 哈希清洗归一raw/ → Bloom 库生成Main.java → 打包发布 GPG 签名最终产物是四个二进制文件App 端按需下载并启用数据库文件容量上限用途hypatia-md5-bloom.bin760 万条MD5 哈希匹配hypatia-sha1-bloom.bin10 万条SHA-1 哈希匹配hypatia-sha256-bloom.bin220 万条SHA-256 哈希匹配hypatia-domains-bloom.bin450 万条恶意域名匹配所有库的误报率FPP都被压到 0.00001默认启用时内存占用低于 120MB。第一步用采集脚本汇聚 10 威胁情报源所有的采集脚本都放在 scripts/ 目录下统一以0开头编号每个脚本对应一个公开情报源负责把不同格式的源数据翻译成 Hypatia 能读的纯哈希列表采集脚本情报来源产出0clamav.shClamAV 主库/每日库raw/哈希库 exclusions/误报排除表0eset.shESET 恶意软件 IoC.hdb/.hsb哈希文件0sanesecurity.shSanesecurity 社区库按库名归并去重的哈希文件0cybercure.shCyberCure 哈希接口raw/cybercure.md50avast-covid19.shAvast IoC CSVavast-covid19.sha2560malshare-bulk.sh 0malshare-combine.shMalshare 每日文件清单2013 至今按年份去重的 md5/sha2560stalkerware.sh间谍软件指标库stalkerware.hsb0targetedthreats.sh定向攻击威胁指标带攻击者-家族描述的 hdb/hsb0threatfox.shThreatFox 全量导出threatfox.sha2560threatview.shThreatView 哈希订阅raw/threatview.md5/sha1以 ClamAV 为例脚本的核心动作只有两行把压缩的 ClamAV 库复制到临时目录再用sigtool -u解包cp /var/lib/clamav/main.c*d . sigtool -u main.c*d解包出的.hdb/.hsb等哈希库移入raw/而*.fp*误报false positive文件移入exclusions/—— 这一步至关重要它让后续的 Bloom 库生成时能主动剔除已知良性哈希从源头降低误报。第二步理解 raw/ 目录的哈希格式约定采集脚本的输出五花八门但 Hypatia 只认五种格式全部由转换工具统一解析见 scripts/Main.java.hdb/.hsb/.hdu/.hsuClamAV 风格哈希:大小:名称:版本取冒号前的第一列.md5/.sha1/.sha256/.hashes一行一个纯哈希.loki哈希;注释取分号前.txt尽力解析best effort后缀.gz的文件会自动解压读取每条候选哈希还要通过 addChecked() 的三道关卡是合法十六进制字符串长度恰好是 32 / 40 / 64对应 MD5 / SHA-1 / SHA-256否则计入无效行不在排除表里——命中exclusions/中的哈希会打印Skipping excluded hash并跳过。也就是说只要你的新情报源能产出一个哈希文件丢进raw/就能被自动纳入这是整个管线最低门槛的地方。第三步Bloom 库生成的核心——Main.java数据库转换工具就是 scripts/Main.java打包后为HypatiaDatabaseConverterjar。它基于 Guava 的 BloomFilter 一次性创建四个过滤器Main.java#L71-L81signaturesMD5 BloomFilter.create(Funnels.stringFunnel(Charsets.US_ASCII), 7600000, 0.00001); 为什么用 Bloom 而不是哈希白名单Bloom 用固定大小的位数组就能回答这个哈希在不在库里内存占用极小、查询 O(k)代价是极低的概率误报这里只有千万分之一。对文件不出设备的隐私场景这是最优雅的权衡。运行流程Main.java#L142-L251加载排除表读取exclusions/下全部哈希构建排除集合逐文件扫描raw/按上面五种格式解析通过校验的哈希写入对应过滤器打印构建报告读取行数、新增数、每个库的填充率Fill amount、预期误报率并回扫排除表确认没有漏网的误报哈希落盘四个.bin文件到输出目录。如果以-extended参数运行MD5 容量会扩到 5200 万条并先加载上一次的hypatia-md5-bloom.bin做跨批次去重Main.java#L82-L92适合增量并入海量历史数据。一条命令即可执行java -jar HypatiaDatabaseConverter-0.1__.jar raw/第四步打包统计与发布0genbloom.sh 负责把构建结果变成可发布的站点页面用template.html作为外壳把转换器的完整运行日志含每个情报源的入库数量嵌进production/index.html把四个hypatia-*-bloom.bin移入production/对日志中标记跳过的哈希自动补上 VirusTotal 检索链接方便人工复核。发布后App 端通过 SignatureDatabase.java 下载.bin文件并用 GPGDetachedSignatureVerifier.java 校验随附的.sigGPG 签名——签名不过关的数据库不会生效若服务器端文件未变更HTTP 304则完全不会重复下载。如何验证你的 Hypatia 签名数据库构建成功构建完成后先看报告里的三项关键指标Expected false postive rate应保持在 0.00001 量级Testing exclusions段落应输出No exclusions found :)——说明误报表已生效Fill amount不应接近 100%留有余量才能保证误报率不飙升。然后做最直观的端到端测试把项目里现成的测试文件 graphics/hypatia-test-file.png 保存到手机内部存储由于 Hypatia 的实时扫描基于递归 FileObserver 监听写入/重命名事件保存后应立刻弹出检测通知——你的签名数据库链路就跑通了。✅常见问题FAQQ想加一个新威胁情报源要改多少代码零。只需新写一个0xxx.sh采集脚本把结果输出为raw/下的哈希文件即可被Main.java自动识别。Q数据库多久更新一次按情报源的更新节奏定期重跑采集 → 转换 → 发布三步并重新 GPG 签名即可客户端靠 304 机制自动判断是否需要更新。Q误报了怎么办把对应哈希追加进exclusions/中的排除文件下次构建时会自动跳过并出现在Skipping excluded hash日志中。从一行sigtool -u到一个亿级哈希的离线扫描库Hypatia 用不到一千行核心代码加一组 Shell 脚本就搭起了一条完整、可审计、可复现的威胁情报流水线。理解了这条流水线你也就理解了离线恶意软件扫描的全部秘密。【免费下载链接】HypatiaA realtime malware scanner项目地址: https://gitcode.com/gh_mirrors/hyp/Hypatia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考