指纹数据库
700+ 指纹 MMH3 int32 Lite/Full 双模式内置 700+ 已知服务指纹,通过一个图标哈希即可识别背后运行的服务。
概览
指纹库是 IconHash 的核心资产之一。它将"图标哈希 → 服务身份"的映射预先建好,让你无需访问目标即可知道对方在用什么。
核心价值
一个 int32 哈希值就能反查服务身份——不依赖 HTML 文本、不依赖端口特征,绕过大量传统指纹识别的盲区。对攻防双方都是低成本、高信噪比的资产识别手段。
数据结构
每个指纹条目的结构:
示例(简化):
完整 JSON Schema 字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
hash | int32 | 是 | MMH3 计算的图标哈希值(可负) |
service | string | 是 | 服务名,如 nginx、Jenkins |
category | string | 是 | 主分类,见下方分类清单 |
tags | string[] | 否 | 多维度标签数组,便于检索 |
description | string | 否 | 人类可读的指纹描述 |
json
{
"hash": -1161367058,
"service": "nginx",
"category": "web-server",
"tags": ["web", "proxy"],
"description": "Nginx default favicon"
}指纹分类分布
700+ 指纹覆盖的主要类别(示意):
web-server app-framework ops security iot cms db-admin完整分类清单(点击展开)
分类 (category) | 典型服务 | 用途 |
|---|---|---|
web-server | nginx、apache、IIS、Caddy | Web 服务器识别 |
app-framework | Spring、Django、Rails、ThinkPHP | 开发框架特征 |
ops | Jenkins、Grafana、Kubernetes、Prometheus | 运维 / DevOps 面板 |
security | WAF、防火墙、VPN、堡垒机 | 安全设备定位 |
iot | 路由器、摄像头、NAS、打印机 | 物联网资产 |
cms | WordPress、Drupal、Discuz | 内容管理系统 |
db-admin | phpMyAdmin、Adminer、Mongo Express | 数据库管理面板 |
加载机制
两种构建模式
- Lite 模式:二进制体积小,指纹库在首次查询时从 GitHub 拉取并缓存到本地,适合 CLI 临时调用。
- Full 模式:指纹库通过
embed.FS编译进二进制,离线可用,适合内网/隔离环境部署。
查询流程
内存索引为 map[int32]Fingerprint,O(1) 查询。
为什么是 O(1)?
指纹哈希本身就是 int32,直接作为 map 的 key 使用,无需遍历、无需排序、无需字符串比较。即使 700+ 扩展到 7000+,单次查询仍是常数时间——这是哈希指纹库相比正则匹配类指纹的核心性能优势。
自定义与合并
支持将自定义指纹合并进库,适合企业内部资产识别:
自定义文件格式:
自定义指纹文件示例
json
[
{
"hash": -1234567890,
"service": "internal-portal",
"category": "custom",
"tags": ["internal"],
"description": "公司内部门户"
}
]覆盖规则
当自定义指纹与内置指纹的 hash 相同 时,自定义条目会覆盖内置条目。这意味着你可以用自定义指纹修正内置库的误报,但也要小心覆盖后丢失原始内置信息(建议在 tags 中保留 builtin-override 标记以便追溯)。
CLI 操作
bash
# 列出全部
iconhash fingerprints list
# 搜索 nginx 相关
iconhash fingerprints search nginx
# 更新(Lite 从远程拉取最新)
iconhash fingerprints update子命令速查
| 子命令 | 作用 | 示例 |
|---|---|---|
list | 列出全部 700+ 指纹 | iconhash fingerprints list |
search <kw> | 按关键字搜索服务名/标签 | iconhash fingerprints search nginx |
update | 更新指纹库(Lite 拉远程,Full 提示重新编译) | iconhash fingerprints update |
API 操作
bash
# 浏览
curl "http://localhost:8000/fingerprints"
# 搜索
curl "http://localhost:8000/fingerprints?q=nginx"
# 查询单个哈希
curl "http://localhost:8000/lookup?hash=-1161367058"API 端点说明
GET /fingerprints:返回指纹列表,支持?q=关键字过滤、分页参数。GET /lookup?hash=<int32>:精确查询单个哈希,命中返回完整指纹条目,未命中返回found: false。- 所有响应均为 JSON 格式,可直接被脚本消费。
实战场景
下面用一张端到端流程图把"图标 → 哈希 → 指纹 → 资产/风险"的完整匹配链路串起来:
场景一:识别未知资产
场景二:批量资产归类
场景三:搜索引擎联动
维护与贡献
指纹库持续更新,欢迎社区贡献新指纹:
如何贡献一条新指纹
- 用
iconhash url <target>或iconhash file favicon.ico算出 MMH3 int32 哈希。 - 确认该哈希未出现在内置库(
iconhash fingerprints list | grep <hash>)。 - 按 数据结构 字段写一条 JSON,
service/category/tags尽量复用已有命名。 - 提交 PR 到
data/fingerprints.json,附上图标来源 URL 便于审核。
贡献前必读
- 禁止贡献未公开披露的私有资产指纹(涉及授权或保密协议的内部系统)。
- 图标来源必须可公开访问(如厂商官网默认 favicon),并在 PR 描述中附上原始 URL。
- 同一图标在不同部署下可能产生不同哈希(base64 编码差异),请以原始二进制为准。
提交格式见 GitHub 仓库 的 data/fingerprints.json。
下一篇:Go SDK。