You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多实例间共享敏感域名数据并保留本地对比能力?

诈骗域名检测Bot的域名管理优化方案

核心需求回顾

  • 多环境(本地、VPS)通过git clone直接同步域名列表,数据不公开
  • Bot支持离线运行
  • 需支持域名精确匹配和相似性对比(精度优于LSH方案)

优化方案:加密明文域名仓库+本地相似性计算

方案细节

  1. 数据存储与同步
    • 将明文域名CSV文件用对称加密(如cryptography库的Fernet算法)加密后,存入私有Git仓库
    • Bot实例首次运行或更新时,从私有Git拉取加密文件,通过本地密钥解密为明文CSV,保存到本地缓存目录
    • 离线运行时直接读取本地缓存的明文CSV,无需依赖网络或Git服务
  2. 相似性对比实现
    • 基于明文域名执行高精度相似性算法:比如编辑距离(Levenshtein Distance)、Jaccard相似度(基于域名字符n-gram或分词),或针对域名优化的逻辑(提取主域名/二级域名后再计算)
    • 可提前预计算相似性索引(如按n-gram分组域名)并存入本地缓存,提升离线匹配速度
  3. 密钥管理
    • 密钥不存入Git仓库,通过环境变量传递(本地设系统环境变量,VPS设服务器环境变量),或用本地.env配置文件(该文件加入.gitignore不提交)

方案优势

  • 适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:30:32