doctorlinux commited on
Commit
7d28f38
·
verified ·
1 Parent(s): 369c8f8

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +202 -72
app.py CHANGED
@@ -1,84 +1,214 @@
1
- # Para usar con Streamlit en HF Spaces
2
- import streamlit as st
3
  import pandas as pd
 
4
 
5
- # Configurar página
6
- st.set_page_config(
7
- page_title="Local Pwned Checker",
8
- page_icon="🔍",
9
- layout="wide"
10
- )
11
-
12
- # Base de datos de breaches
13
  BREACHES_DB = {
14
- "LinkedIn 2012": {"date": "2012-06-05", "records": "165M", "emails": ["test@example.com"]},
15
- "Adobe 2013": {"date": "2013-10-04", "records": "153M", "emails": ["test@example.com"]},
16
- "Yahoo 2014": {"date": "2014-12-01", "records": "500M", "emails": ["user123@gmail.com"]},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  }
18
 
19
- def main():
20
- st.title("🔍 Local Pwned Checker")
21
- st.markdown("Verifica si tus datos aparecen en filtraciones conocidas")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- tab1, tab2, tab3 = st.tabs(["📧 Verificar Email", "🔐 Verificar Contraseña", "📊 Estadísticas"])
 
 
 
 
24
 
25
- with tab1:
26
- st.header("Verificación de Email")
27
- email = st.text_input("Dirección de correo electrónico", placeholder="tuemail@dominio.com")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- if st.button("Verificar Breaches", type="primary"):
30
- if email:
31
- breaches_found = []
32
-
33
- for breach_name, breach_data in BREACHES_DB.items():
34
- if email in breach_data["emails"]:
35
- breaches_found.append({
36
- "Filtración": breach_name,
37
- "Fecha": breach_data["date"],
38
- "Registros": breach_data["records"],
39
- "Estado": "❌ COMPROMETIDO"
40
- })
41
-
42
- if breaches_found:
43
- st.error(f"El email **{email}** aparece en {len(breaches_found)} filtración(es)")
44
- st.dataframe(pd.DataFrame(breaches_found), use_container_width=True)
45
- else:
46
- st.success(f"✅ El email **{email}** NO aparece en nuestras bases de datos conocidas")
47
- else:
48
- st.warning("Por favor ingresa un email para verificar")
49
-
50
- with tab2:
51
- st.header("Verificación de Contraseña")
52
- password = st.text_input("Contraseña", type="password", placeholder="Ingresa tu contraseña...")
53
 
54
- if st.button("Analizar Seguridad"):
55
- if password:
56
- # Análisis básico de fortaleza
57
- score = 0
58
- if len(password) >= 8: score += 1
59
- if any(c.islower() for c in password) and any(c.isupper() for c in password): score += 1
60
- if any(c.isdigit() for c in password): score += 1
61
- if any(c in "!@#$%^&*()" for c in password): score += 1
62
-
63
- if score == 4:
64
- st.success("🔒 Contraseña FUERTE")
65
- elif score >= 2:
66
- st.warning("🟡 Contraseña MEDIA")
67
- else:
68
- st.error("🔴 Contraseña DÉBIL")
69
-
70
- st.info("💡 Consejo: Usa contraseñas únicas para cada servicio y activa 2FA")
71
-
72
- with tab3:
73
- st.header("Estadísticas de Breaches")
74
- stats_data = []
75
- for name, data in BREACHES_DB.items():
76
- stats_data.append([name, data["date"], data["records"]])
77
 
78
- st.dataframe(
79
- pd.DataFrame(stats_data, columns=["Filtración", "Fecha", "Registros"]),
80
- use_container_width=True
81
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
 
83
  if __name__ == "__main__":
84
- main()
 
1
+ import gradio as gr
 
2
  import pandas as pd
3
+ import hashlib
4
 
5
+ # Base de datos de breaches de ejemplo
 
 
 
 
 
 
 
6
  BREACHES_DB = {
7
+ "LinkedIn 2012": {
8
+ "date": "2012-06-05",
9
+ "records": "165 millones",
10
+ "emails": ["test@example.com", "user123@gmail.com", "admin@site.com"]
11
+ },
12
+ "Adobe 2013": {
13
+ "date": "2013-10-04",
14
+ "records": "153 millones",
15
+ "emails": ["test@example.com", "contact@business.org"]
16
+ },
17
+ "Yahoo 2014": {
18
+ "date": "2014-12-01",
19
+ "records": "500 millones",
20
+ "emails": ["user123@gmail.com", "webmaster@company.com"]
21
+ },
22
+ "Dropbox 2012": {
23
+ "date": "2012-07-01",
24
+ "records": "68 millones",
25
+ "emails": ["test@example.com", "support@helpdesk.com"]
26
+ }
27
  }
28
 
29
+ def check_email_breaches(email):
30
+ """Verifica si un email aparece en breaches"""
31
+ if not email or "@" not in email:
32
+ return "Por favor ingresa un email válido", None
33
+
34
+ breaches_found = []
35
+ for breach_name, breach_data in BREACHES_DB.items():
36
+ if email.lower() in [e.lower() for e in breach_data["emails"]]:
37
+ breaches_found.append({
38
+ "Filtración": breach_name,
39
+ "Fecha": breach_data["date"],
40
+ "Registros": breach_data["records"],
41
+ "Estado": "❌ COMPROMETIDO"
42
+ })
43
+
44
+ if breaches_found:
45
+ df = pd.DataFrame(breaches_found)
46
+ message = f"⚠️ **{email}** aparece en **{len(breaches_found)}** filtración(es)"
47
+ return message, df
48
+ else:
49
+ return f"✅ **{email}** NO aparece en nuestras bases de datos conocidas", None
50
+
51
+ def analyze_password(password):
52
+ """Analiza la fortaleza de una contraseña"""
53
+ if not password:
54
+ return "Ingresa una contraseña para analizar"
55
+
56
+ score = 0
57
+ feedback = []
58
+
59
+ # Longitud
60
+ if len(password) >= 12:
61
+ score += 2
62
+ feedback.append("✅ Longitud excelente (12+ caracteres)")
63
+ elif len(password) >= 8:
64
+ score += 1
65
+ feedback.append("✅ Longitud adecuada (8+ caracteres)")
66
+ else:
67
+ feedback.append("❌ Muy corta (mínimo 8 caracteres)")
68
 
69
+ # Complejidad
70
+ has_lower = any(c.islower() for c in password)
71
+ has_upper = any(c.isupper() for c in password)
72
+ has_digit = any(c.isdigit() for c in password)
73
+ has_special = any(c in "!@#$%^&*()_+-=[]{}|;:,.<>?" for c in password)
74
 
75
+ if has_lower and has_upper:
76
+ score += 1
77
+ feedback.append(" Mezcla de mayúsculas y minúsculas")
78
+ else:
79
+ feedback.append("❌ Mezcla mayúsculas y minúsculas")
80
+
81
+ if has_digit:
82
+ score += 1
83
+ feedback.append("✅ Incluye números")
84
+ else:
85
+ feedback.append("❌ Añade números")
86
+
87
+ if has_special:
88
+ score += 1
89
+ feedback.append("✅ Caracteres especiales")
90
+ else:
91
+ feedback.append("❌ Incluye caracteres especiales")
92
+
93
+ # Evaluación final
94
+ if score >= 5:
95
+ strength = "🔒 **EXCELENTE**"
96
+ color = "green"
97
+ elif score >= 3:
98
+ strength = "🟡 **MEDIA**"
99
+ color = "orange"
100
+ else:
101
+ strength = "🔴 **DÉBIL**"
102
+ color = "red"
103
+
104
+ result = f"## Fortaleza de la contraseña: {strength}\n\n"
105
+ result += "\n".join(feedback)
106
+ result += f"\n\n**Puntuación:** {score}/6"
107
+
108
+ return result
109
+
110
+ def get_breach_statistics():
111
+ """Genera estadísticas de la base de datos"""
112
+ stats = []
113
+ total_emails = set()
114
+
115
+ for breach_name, breach_data in BREACHES_DB.items():
116
+ stats.append([
117
+ breach_name,
118
+ breach_data["date"],
119
+ breach_data["records"],
120
+ len(breach_data["emails"])
121
+ ])
122
+ total_emails.update(breach_data["emails"])
123
+
124
+ df = pd.DataFrame(stats, columns=["Filtración", "Fecha", "Registros", "Emails únicos"])
125
+ return df, f"**Total de emails únicos en DB:** {len(total_emails)}"
126
+
127
+ # Crear la interfaz
128
+ with gr.Blocks(theme=gr.themes.Soft(), title="Local Pwned Checker") as demo:
129
+ gr.Markdown("# 🔍 Local Pwned Checker")
130
+ gr.Markdown("Verifica si tus datos aparecen en filtraciones conocidas - **100% local y privado**")
131
+
132
+ with gr.Tab("📧 Verificar Email"):
133
+ gr.Markdown("### Verifica si tu email ha sido comprometido")
134
+ with gr.Row():
135
+ with gr.Column():
136
+ email_input = gr.Textbox(
137
+ label="Dirección de correo electrónico",
138
+ placeholder="ejemplo@dominio.com",
139
+ max_lines=1
140
+ )
141
+ email_btn = gr.Button("🔍 Verificar Breaches", variant="primary")
142
+
143
+ with gr.Column():
144
+ email_output = gr.Markdown(label="Resultado")
145
+ breaches_table = gr.Dataframe(
146
+ label="Filtraciones Detectadas",
147
+ headers=["Filtración", "Fecha", "Registros", "Estado"]
148
+ )
149
+
150
+ with gr.Tab("🔐 Analizar Contraseña"):
151
+ gr.Markdown("### Analiza la fortaleza de tu contraseña")
152
+ with gr.Row():
153
+ with gr.Column():
154
+ password_input = gr.Textbox(
155
+ label="Contraseña",
156
+ placeholder="Ingresa tu contraseña aquí...",
157
+ type="password"
158
+ )
159
+ password_btn = gr.Button("📊 Analizar Seguridad", variant="primary")
160
+
161
+ with gr.Column():
162
+ password_output = gr.Markdown(label="Resultado del Análisis")
163
+
164
+ with gr.Tab("📊 Estadísticas"):
165
+ gr.Markdown("### Base de Datos de Filtraciones")
166
+ stats_btn = gr.Button("🔄 Actualizar Estadísticas", variant="secondary")
167
+ stats_output = gr.Markdown()
168
+ stats_table = gr.Dataframe(label="Breaches en Base de Datos")
169
+
170
+ with gr.Tab("ℹ️ Información"):
171
+ gr.Markdown("""
172
+ ## 📖 Acerca de Local Pwned Checker
173
+
174
+ Esta es una herramienta **demonstrativa** que simula la funcionalidad de servicios como "Have I Been Pwned".
175
 
176
+ ### ⚠️ Características importantes:
177
+ - **Base de datos local** con filtraciones de ejemplo
178
+ - **100% privado** - no se envían datos a servidores externos
179
+ - **Solo demostración** - para uso real visita [Have I Been Pwned](https://haveibeenpwned.com/)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
+ ### 🔒 Consejos de seguridad:
182
+ 1. Usa contraseñas únicas para cada servicio
183
+ 2. Activa la autenticación de dos factores (2FA)
184
+ 3. Usa un gestor de contraseñas
185
+ 4. Verifica regularmente tus cuentas
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
+ ### 🛡️ Esta aplicación NO:
188
+ - Almacena tus consultas
189
+ - Comparte tus datos
190
+ - Requiere registro
191
+ - Tiene costo alguno
192
+ """)
193
+
194
+ # Conectar eventos
195
+ email_btn.click(
196
+ fn=check_email_breaches,
197
+ inputs=email_input,
198
+ outputs=[email_output, breaches_table]
199
+ )
200
+
201
+ password_btn.click(
202
+ fn=analyze_password,
203
+ inputs=password_input,
204
+ outputs=password_output
205
+ )
206
+
207
+ stats_btn.click(
208
+ fn=get_breach_statistics,
209
+ outputs=[stats_table, stats_output]
210
+ )
211
 
212
+ # Para Hugging Face
213
  if __name__ == "__main__":
214
+ demo.launch()