string_analyze/rules/core/
apikey_ai.rs1use crate::rules::lazy_rule;
2
3lazy_rule!(
5 RE_ANTHROPIC_KEY = r#"\bsk-ant-(?:api03|oat01)-[A-Za-z0-9_-]{80,}\b"#,
6 "发现 Anthropic (Claude) API Key",
7 95
8);
9
10lazy_rule!(
12 RE_OPENROUTER_KEY = r#"\bsk-or-v1-[a-f0-9]{64}\b"#,
13 "发现 OpenRouter API Key",
14 90
15);
16
17lazy_rule!(
19 RE_GROQ_KEY = r#"\bgsk_[A-Za-z0-9]{48,64}\b"#,
20 "发现 Groq API Key",
21 95
22);
23
24lazy_rule!(
26 RE_HUGGINGFACE_KEY = r#"\bhf_[A-Za-z0-9]{30,50}\b"#,
27 "发现 Hugging Face Token",
28 90
29);
30
31lazy_rule!(
33 RE_PERPLEXITY_KEY = r#"\bpplx-[A-Za-z0-9]{40,60}\b"#,
34 "发现 Perplexity API Key",
35 90
36);
37
38lazy_rule!(
40 RE_NVIDIA_NIM_KEY = r#"\bnvapi-[A-Za-z0-9_-]{60,80}\b"#,
41 "发现 NVIDIA NIM API Key",
42 90
43);
44
45lazy_rule!(
47 RE_XAI_KEY = r#"\b(?:xai-token-|xai-)[A-Za-z0-9_-]{40,120}\b"#,
48 "发现 xAI (Grok) API Key",
49 90
50);
51
52lazy_rule!(
54 RE_GEMINI_KEY = r#"\bAIzaSy[A-Za-z0-9_-]{33}\b"#,
55 "发现 Google Gemini API Key",
56 90
57);
58
59lazy_rule!(
60 RE_OPENAI_KEY = r#"\bsk-(?:proj-|svcacct-|admin-)?[A-Za-z0-9_]{20,120}\b"#,
61 "发现 OpenAI API Key",
62 88,
63 |slice, _input| {
64 if slice.starts_with("sk-or-v1-") {
65 return false;
66 } if slice.starts_with("sk-ant-") {
68 return false;
69 } if slice.len() == 35 && slice[3..].chars().all(|c| c.is_ascii_hexdigit()) {
72 return false;
73 }
74
75 if (40..=64).contains(&(slice.len() - 3))
76 && slice[3..]
77 .chars()
78 .all(|c| c.is_ascii_lowercase() || c.is_ascii_digit())
79 {
80 return false;
81 }
82
83 true
84 }
85);
86
87lazy_rule!(
89 RE_DEEPSEEK_KEY = r#"\bsk-[a-f0-9]{32}\b"#,
90 "发现 DeepSeek API Key",
91 85
92);
93
94lazy_rule!(
96 RE_SILICONFLOW_KEY = r#"\bsk-[a-z0-9]{40,64}\b"#,
97 "发现 SiliconFlow API Key",
98 80
99);
100
101lazy_rule!(
103 RE_ELEVENLABS_KEY = r#"\bsk_[a-f0-9]{48}\b"#,
104 "发现 ElevenLabs API Key",
105 75
106);
107
108lazy_rule!(
110 RE_CEREBRAS_KEY = r#"\bcsk-[a-z0-9]{40,60}\b"#,
111 "发现 Cerebras API Key",
112 85
113);
114
115#[cfg(test)]
116mod tests {
117 use crate::analyze_with;
118 use crate::rules::get_rules;
119
120 #[test]
121 fn test() {
122 let input = r#"
123flag{5tgb8uik,0ol}
124deepseek_key = "sk-514d49dd9cd9111111b23a9b9fffffff";
125siliconflow_key: sk-senitvfaimsnaxkhkhuskuekhbigijnpvtfcxqxiuaaaaaaa
126xai_key = xai-token-saYrl4NtQZQ1nLBmFQUAHSwrDR0L4ZCg6kEafTrRsCkz4ZEjyfEkcGpwy2NXcSWQ9Z7KxaAAAAAAAAAA
127xai_official = xai-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
128sk-or-v1-514d49dd9cd9111111b23a9b9fffffff514d49dd9cd9111111b23a9b9fffffff # openrouter
129openai_key = sk-proj-abcdefghijklmnopqrstuvwxyz1234567890ABCDEF
130anthropic_key = sk-ant-api03-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
131groq_key = gsk_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX
132hf_token = hf_abcdefghijklmnopqrstuvwxyzABCDEFGHIJ
133pplx_key = pplx-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
134gemini_key = AIzaSyabcdefghijklmnopqrstuvwxyz1234567
135nvapi_key = nvapi-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
136"#;
137 for line in input.lines() {
138 println!(
139 "{:#}",
140 analyze_with(
141 line,
142 &get_rules(|m, _| module_path!().split("::tests").any(|s| s == m)),
143 )
144 )
145 }
146 }
147}