如何在多实例间共享敏感域名数据并保留本地对比能力?
诈骗域名检测Bot的域名管理优化方案
核心需求回顾
- 多环境(本地、VPS)通过
git clone直接同步域名列表,数据不公开 - Bot支持离线运行
- 需支持域名精确匹配和相似性对比(精度优于LSH方案)
优化方案:加密明文域名仓库+本地相似性计算
方案细节
- 数据存储与同步
- 将明文域名CSV文件用对称加密(如
cryptography库的Fernet算法)加密后,存入私有Git仓库 - Bot实例首次运行或更新时,从私有Git拉取加密文件,通过本地密钥解密为明文CSV,保存到本地缓存目录
- 离线运行时直接读取本地缓存的明文CSV,无需依赖网络或Git服务
- 将明文域名CSV文件用对称加密(如
- 相似性对比实现
- 基于明文域名执行高精度相似性算法:比如编辑距离(Levenshtein Distance)、Jaccard相似度(基于域名字符n-gram或分词),或针对域名优化的逻辑(提取主域名/二级域名后再计算)
- 可提前预计算相似性索引(如按n-gram分组域名)并存入本地缓存,提升离线匹配速度
- 密钥管理
- 密钥不存入Git仓库,通过环境变量传递(本地设系统环境变量,VPS设服务器环境变量),或用本地
.env配置文件(该文件加入.gitignore不提交)
- 密钥不存入Git仓库,通过环境变量传递(本地设系统环境变量,VPS设服务器环境变量),或用本地
方案优势
- 适配
git clone运行:私有Git拉取加密文件,本地解密即可使用,无需FTP等额外工具 - 数据安全:加密后的文件即使泄露也无法直接读取域名列表
- 完全支持离线:解密后的明文缓存本地,断网时不影响检测功能
- 相似性精度拉满:基于明文计算,避免LSH的精度损失
- 维护成本低:与原有CSV流程兼容,仅增加加密/解密步骤
简化代码示例
from cryptography.fernet import Fernet import os import csv # 从环境变量获取加密密钥 ENCRYPT_KEY = os.getenv("DOMAIN_LIST_KEY") cipher = Fernet(ENCRYPT_KEY) def load_domain_list(): cache_path = "./local_cache/domains.csv" # 优先读取本地缓存 if os.path.exists(cache_path): with open(cache_path, "r", encoding="utf-8") as f: return list(csv.DictReader(f)) # 缓存不存在则解密Git中的加密文件 encrypted_path = "./encrypted_domains.csv.enc" with open(encrypted_path, "rb") as f: encrypted_data = f.read() decrypted_data = cipher.decrypt(encrypted_data).decode("utf-8") # 写入本地缓存 os.makedirs(os.path.dirname(cache_path), exist_ok=True) with open(cache_path, "w", encoding="utf-8") as f: f.write(decrypted_data) return list(csv.DictReader(decrypted_data.splitlines())) # 编辑距离计算示例(用于相似性对比) def levenshtein_distance(s1, s2): if len(s1) < len(s2): return levenshtein_distance(s2, s1) if len(s2) == 0: return len(s1) previous_row = range(len(s2) + 1) for i, c1 in enumerate(s1): current_row = [i + 1] for j, c2 in enumerate(s2): insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) current_row.append(min(insertions, deletions, substitutions)) previous_row = current_row return previous_row[-1]
补充说明
- 私有Git仓库可选用GitHub私有库、GitLab私有库,或自建Git服务,确保仅你有权限访问
- 更新域名列表时,本地修改明文CSV后重新加密提交到Git,其他实例拉取后重新解密即可更新缓存
- 环境变量配置:Linux/macOS用
export DOMAIN_LIST_KEY="你的密钥",Windows用set DOMAIN_LIST_KEY="你的密钥",VPS可在启动脚本或服务器环境变量中配置
内容的提问来源于stack exchange,提问作者Z_runner
相关产品推荐
相关产品推荐

