ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ciphey 存储模块深度解析:SQLite 缓存、WaitAthena 结果与静态数据资源的统一管理

Ciphey 存储模块深度解析:SQLite 缓存、WaitAthena 结果与静态数据资源的统一管理 Ciphey 存储模块深度解析SQLite 缓存、WaitAthena 结果与静态数据资源的统一管理【免费下载链接】Ciphey⚡ Automatically decrypt encryptions without knowing the key or cipher, decode encodings, and crack hashes ⚡项目地址: https://gitcode.com/gh_mirrors/ci/Ciphey本篇技术指南以 Ciphey 的 src/storage/README.md 为骨架系统拆解 storage 模块的职责定位、静态资源字符表/字母频率/ngram的加载方式、SQLite 缓存数据库的表结构与完整 CRUD 调用链以及 WaitAthena 明文结果的进程内存储机制帮助你理解自动解码器在存什么、怎么存、何时命中缓存上的底层设计并掌握在代码中接入这些存储 API 的具体方法。一、Storage 模块是什么一句话定义与四大职责src/storage是 Ciphey 中负责存放东西的模块。原文档开宗明义地写道在 Ciphey 的生命周期里程序需要存储以下四类数据词表Word lists用于词表检查器wordlist checker的候选词集合字典Dictionaries多语言词典供不同语言的明文识别使用破解结果Crack results包括命中的密钥key、最终明文plaintext、解码路径path等其他语言的字典面向非英语场景的扩展数据。在此基础上原文档点明了 storage 模块的核心设计目标它是一套统一的数据访问层负责加载这些信息、统一处理错误并通过缓存caching加速整个程序。换言之storage 不是简单地读文件而是带着错误处理和缓存策略去读文件。从源码结构看该模块当前由三部分构成见 src/storage/mod.rs子模块 / 资源文件路径职责SQLite 数据库管理src/storage/database.rs缓存已知的编码文本 → 解码结果关系并统计搜索算法性能WaitAthena 结果存储src/storage/wait_athena_storage.rs在 top_results 模式下收集多个候选明文结果静态资源数据src/storage/invisible_chars/chars.txt、src/storage/ngrams/english_bigrams.txt不可见字符集合、英文二元组频率表模块对外通过 src/lib.rs 的pub mod storage;公开是 Ciphey 库 API 的一部分。二、静态资源不可见字符集、字母频率与英文二元组storage 目录下的数据文件不是文档而是程序运行时真实加载的资源。从实现看它们均通过Lazy惰性静态初始化在首次访问时一次性载入内存之后常驻。2.1 不可见字符表解码结果的卫生检查依据src/storage/invisible_chars/chars.txt 以UXXXX加 Unicode 名称的格式逐行列出了 50 余种不可见字符覆盖控制类空白U0009制表符、U0020空格、U00A0不换行空格、U00AD软连字符零宽字符U200B零宽空格、U200C零宽非连接符、U200D零宽连接符、UFEFF零宽不换行空格各类空格变体U2000~U200AEN/EM/THIN/HAIR 空格等、U202F、U205F、U3000表意空格隐形标记U2061~U2064不可见乘号/分隔符/加号、U206A~U206F、U1D159等。加载逻辑位于 src/storage/mod.rs程序通过env!(CARGO_MANIFEST_DIR)定位到仓库根目录拼接src/storage/invisible_chars/chars.txt路径逐行解析行首的U十六进制码点用char::from_u32转成字符后放入HashSetchar。最终暴露为INVISIBLE_CHARS静态变量。该集合的实际消费方在 src/cli_pretty_printing/mod.rs当程序输出解密结果时会统计明文中不可见字符的占比一旦超过 30%INVIS_CHARS_DETECTION_PERCENTAGE 0.3就提示用户是否将明文保存到文件——避免终端被零宽字符之类的隐形文本污染属于典型的输出层卫生防护。配套的单测见 src/storage/mod.rs断言集合非空、包含空格U0020与零宽空格U200B。2.2 英文单字母频率频度分析解码器的基础数据src/storage/mod.rs 定义了ENGLISH_FREQS: [f64; 26]常量按 A–Z 顺序给出英语字母的标准出现频率如 E 为 0.12702、T 为 0.09056、Z 为 0.00074。这类数据是凯撒密码、替换密码等频度分析型解码器的判分依据作为模块级常量随库一起编译属于零 IO 开销的静态资源。2.3 英文二元组频率表维吉尼亚密码的适应度评估src/storage/ngrams/english_bigrams.txt 共 676 行覆盖全部 26×26 组合每行格式为双字母 出现频次例如TH 116997844 HE 100689263 IN 87674002 ER 77134382 AN 69775179该文件的主要消费方是 src/decoders/vigenere_decoder.rs。解码器在启动时将其解析为一个 26×26 的VecVeci64适应度矩阵行、列分别对应双字母的首尾字符char as u8 - bA映射到 0~25用于评估候选密钥生成的明文像不像英语从而在无密钥前提下破解维吉尼亚密码。三、SQLite 缓存数据库已知解码关系的持久化层原文档明确 storage 要缓存已知的编码/解码关系以加速程序这正是 src/storage/database.rs 的实现职责。文件头注释给出了两个设计意图缓存已知的 encoded/decoded 字符串关系以及收集 Ciphey 搜索算法的性能统计。3.1 全局路径与两种连接模式数据库路径由静态变量DB_PATH: OnceLockOptionPathBuf持有src/storage/database.rs默认路径是~/.ciphey/database.sqlite见 get_database_path连接策略分两种get_db_connection若DB_PATH已设置则Connection::open(path)打开磁盘文件否则回退到Connection::open_in_memory()内存库。测试正是利用这一点通过file::memory:?cacheshared共享内存库来隔离用例src/storage/database.rs初始化入口setup_database()会先尝试写入默认路径失败时打印警告并继续src/storage/database.rs。3.2 两张表、四个索引完整 Schemainit_database()src/storage/database.rs用CREATE TABLE IF NOT EXISTS幂等地建立两张表并由测试correct_cache_table_schema/correct_human_rejection_table_schema通过PRAGMA table_info逐列断言其精确结构src/storage/database.rscache 表缓存解码结果列名类型说明uuidTEXT PRIMARY KEY NOT NULL条目唯一标识encoded_textTEXT NOT NULL解码前的文本decoded_textTEXT NOT NULL解码后的文本pathJSON NOT NULL有序的解码尝试链CrackResult 的 JSON 序列化successfulBOOLEAN NOT NULL DEFAULT true解码是否成功execution_time_msINTEGER NOT NULL解码耗时毫秒timestampDATETIME DEFAULT CURRENT_TIMESTAMP记录时间索引idx_cache_encoded_text ON cache(encoded_text)。human_rejection 表记录被人工/检查器判定为失败解码的明文列名类型说明uuidTEXT PRIMARY KEY NOT NULL条目唯一标识plaintextTEXT NOT NULL被标记为解码失败的明文checkerTEXT NOT NULL用于确认明文的检查器名称timestampDATETIME DEFAULT CURRENT_TIMESTAMP记录时间索引idx_stats_plaintext ON human_rejection(plaintext)。对应的内存模型是CacheRow、CacheEntry、HumanRejectionRow三个结构体src/storage/database.rs其中CacheEntry.path直接存放VecCrackResult落库时再逐个get_json()序列化为 JSON 字符串数组src/storage/database.rs。3.3 六个核心 API增删改查全覆盖函数作用关键实现点insert_cache(CacheEntry)新增缓存记录事务内 INSERTsuccessful取自 path 最后一个 CrackResult 的 success 标志read_cache(String)按 encoded_text 查缓存SELECT * ... WHERE encoded_text IS $1命中返回CacheRow未命中返回Noneupdate_cache(CacheEntry)更新已有记录以 encoded_text 为 WHERE 条件做 UPDATEdelete_cache(str)删除记录按 encoded_text DELETEinsert_human_rejection(...)记录一次失败解码事务内 INSERT记录 checker 名称read_human_rejection(String)查询失败记录命中返回HumanRejectionRow所有写操作都包在transaction中执行如 src/storage/database.rs保证原子性时间戳由get_timestamp()统一生成YYYY-MM-DD HH:MM:SS格式src/storage/database.rs。3.4 与主流程的调用链从缓存命中到回写database模块的消费入口是 src/lib.rs 的perform_cracking其缓存策略清晰可读启动时初始化调用setup_database()失败仅告警不中断src/lib.rs先查缓存read_cache(text)若命中且path能成功反序列化直接返回缓存中的DecoderResult跳过整个搜索过程src/lib.rs搜索成功后回写success_result_to_cache计算SystemTime耗时差得到execution_time_ms构造CacheEntry后insert_cachesrc/lib.rs若输入本身就是明文也会走同样路径写入缓存。这一先查后写的流程正是原文档所说caching them to speed up the program的直接体现同一个编码文本第二次运行时可以完全跳过解码搜索。测试用例如cache_read_hit、cache_delete_success_one_entry、cache_update_1_change_1_entry_success[src/storage/database.rs](https://link.gitcode.com/i/46512b6a179610eb1bb2a0f136ac2bc1#L747-L767, L848-L867, L950-L980)完整覆盖了命中、删除、更新三种场景可作为理解语义的参考。注意缓存命中仅当encoded_text完全一致时才有效human_rejection表面向检查器判定某明文为失败结果的统计与去重场景用于避免重复解码已知的无效文本。四、WaitAthena 存储top_results 模式下的进程内结果收集如果说 database 是跨运行的持久化那么 src/storage/wait_athena_storage.rs 就是单次运行内的临时结果池服务于 Ciphey 的 top_results多结果模式。4.1 数据结构与线程安全设计核心结构PlaintextResult记录四个字段text明文、description结果描述、checker_name生成该结果的检查器、decoder_name生成该结果的解码器见 src/storage/wait_athena_storage.rs。存储本体是一个lazy_static包裹的MutexVecPlaintextResultsrc/storage/wait_athena_storage.rs用互斥锁保证并发安全加锁失败mutex 中毒时会用poisoned.into_inner()恢复而非直接 panicsrc/storage/wait_athena_storage.rs。对外暴露三个函数add_plaintext_result(text, description, checker_name, decoder_name)追加一条结果get_plaintext_results()克隆返回当前全部结果VecPlaintextResultclear_plaintext_results()清空供新一轮破解会话使用。4.2 调用链收集 → 计时 → 展示该模块被三个位置消费构成完整的 top_results 数据流收集A* 搜索器在top_results模式下每当找到一个被检查器确认的明文就调用add_plaintext_result存入src/searchers/astar.rsWaitAthena 检查器自身也会在判定时写入结果src/checkers/wait_athena.rs隔离与清理perform_cracking在开启 top_results 时会强制关闭 human checker 并调用clear_plaintext_results()清空上次会话残留src/lib.rs计时展示src/timer/mod.rs 的倒计时线程到期后若处于 top_results 模式则get_plaintext_results()取出全部结果交给display_top_results统一展示。五、设计启示与使用要点结合原文档与源码可以总结 storage 模块的三条设计原则供后续扩展如新增语言字典、接入新检查器时参考静态资源统一走惰性初始化 常驻内存字符表、bigram 表均用Lazy在首次访问时加载一次路径通过env!(CARGO_MANIFEST_DIR)锚定仓库根目录新增数据文件时保持UXXXX 名称或XX 频次的文本格式即可被现有解析器识别运行期数据按持久/临时分桶跨进程复用、需要统计性能的放 SQLitecache、human_rejection单次会话内并发收集的放MutexVec...wait_athena_storage各自匹配不同的并发与生命周期诉求失败路径默认告警不致命数据库初始化失败、mutex 中毒、反序列化失败时代码普遍降级为warning日志或空值避免存储层的单点故障拖垮整个解码流程。如果你要扩展 storage 模块最直接的入口是在 src/storage/mod.rs 中声明新资源常量参照INVISIBLE_CHARS或ENGLISH_BIGRAMS的加载模式实现并在对应解码器/检查器中消费涉及跨运行缓存时则在 src/storage/database.rs 中新增表结构与配套 CRUD 函数并补上PRAGMA table_info式的 Schema 测试与增删改查用例。相关资源索引模块入口与静态资源src/storage/mod.rsSQLite 缓存实现与全套单测src/storage/database.rsWaitAthena 结果池src/storage/wait_athena_storage.rs不可见字符数据文件src/storage/invisible_chars/chars.txt英文二元组数据文件src/storage/ngrams/english_bigrams.txt主流程缓存调用链src/lib.rs维吉尼亚解码器对 bigram 的消费src/decoders/vigenere_decoder.rs不可见字符检测输出提示src/cli_pretty_printing/mod.rstop_results 模式下的结果展示src/timer/mod.rs【免费下载链接】Ciphey⚡ Automatically decrypt encryptions without knowing the key or cipher, decode encodings, and crack hashes ⚡项目地址: https://gitcode.com/gh_mirrors/ci/Ciphey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表