Una implementación de codificación para construir un canal de análisis de seguridad y detección de tipos de archivos impulsado por IA con Magika y OpenAI
!pip install magika openai -q import os, io, json, zipfile, textwrap, hashlib, tempfile, getpass from pathlib import Ruta desde colecciones import Counter from magika import Magika from magika.types import MagikaResult, PredictionMode from openai import OpenAI print(“🔑 Ingrese su clave API OpenAI (la entrada está oculta):”) api_key = getpass.getpass(“Clave API OpenAI: “) cliente = OpenAI(api_key=api_key) intente: client.models.list() print(“✅ OpenAI conectado exitosamente\n”) excepto excepción como e: elevar SystemExit(f”❌ Error de conexión OpenAI: {e}”) m = Magika() print(“✅ Magika cargado exitosamente\n”) print(f” versión del módulo: {m.get_module_version()}”) print(f” nombre del modelo: {m.get_model_name()}”) print(f” tipos de salida: {len(m.get_output_content_types())} etiquetas admitidas\n”) def Ask_gpt(sistema: str, usuario: str, modelo: str = “gpt-4o”, max_tokens: int = 600) -> str: resp = client.chat.completions.create( model=model, max_tokens=max_tokens, mensajes=[
{“role”: “system”, “content”: system},
{“role”: “user”, “content”: user},
]) devolver opciones respectivas[0].message.content.strip() print(“=” * 60) print(“SECCIÓN 1: API principal + explicación en lenguaje sencillo GPT”) print(“=” * 60) samples = { “Python”: b’import os\ndef greet(name):\n print(f”Hola, {name}”)\n’, “JavaScript”: b’const fetch = require(“node-fetch”);\nasync function getData() { return await fetch(“/api”); }’, “CSV”: b’nombre,edad,ciudad\nAlice,30,NYC\nBob,25,LA\n’, “JSON”: b'{“nombre”: “Alice”, “puntuaciones”: [10, 20, 30]”active”: true}’, “Shell”: b’#!/bin/bash\necho “Hola”\nfor i in $(seq 1 5); hacer eco $i; done’, “PDF magic”: b’%PDF-1.4\n1 0 obj\n<< /Type /Catalog >>\nendobj\n’, “ZIP magic”: bytes([0x50, 0x4B, 0x03, 0x04]) + bytes(26), } print(f”\n{‘Etiqueta’:<12} {'Tipo MIME':<30} {'Puntuación':>6}”) print(“-” * 52) magika_labels = []
para nombre, raw en samples.items(): res = m.identify_bytes(raw) magika_labels.append(res.output.label) print(f”{res.output.label:<12} {res.output.mime_type:<30} {res.score:>5.1%}”) explicación = Ask_gpt( system=”Eres un ingeniero de aprendizaje automático conciso. Explícalo en 4 a 5 oraciones.”, user=( f”Magika es el detector de tipos de archivos con IA de Google. Simplemente identificó estos tipos a partir de bytes sin procesar: ” f”{magika_labels}. Explique cómo un modelo de aprendizaje profundo detecta tipos de archivos ” “solo a partir de bytes, y por qué esto es mejor que confiar en las extensiones de archivo.” ), max_tokens=250, ) print(f”\n💬 GPT sobre cómo funciona Magika:\n{textwrap.fill(explanation, 72)}\n”) print(“=” * 60) print(“SECCIÓN 2 — Identificación de lotes + Resumen GPT”) print(“=” * 60) tmp_dir = Ruta(tempfile.mkdtemp()) file_specs = { “code.py”: b”import sys\nprint(sys.version)\n”, “style.css”: b”body { font-family: Arial; margin: }\n”, “datos.json”: b'[{“id”: 1, “val”: “foo”}, {“id”: 2, “val”: “bar”}]’, “script.sh”: b”#!/bin/sh\necho Hola mundo\n”, “doc.html”: b”

Hola

“, “config.yaml”: b”servidor:\n host: localhost\n puerto: 8080\n”, “query.sql”: b”CREAR TABLA t (id INT PRIMARY KEY, nombre TEXTO);\n”, “notes.md”: b”# Encabezado\n\n- elemento uno\n- elemento dos\n”, } rutas = []
para fname, contenido en file_specs.items(): p = tmp_dir / fname p.write_bytes(content) paths.append(p) results = m.identify_paths(paths) batch_summary = [
{“file”: p.name, “label”: r.output.label,
“group”: r.output.group, “score”: f”{r.score:.1%}”}
for p, r in zip(paths, results)
]

print(f”\n{‘Archivo’:<18} {'Etiqueta':<14} {'Grupo':<12} {'Puntuación':>6}”) print(“-” * 54) para la fila en el resumen_por lotes: print(f”{fila[‘file’]:<18} {fila['label']:<14} {fila['group']:<12} {fila['score']:>6}”) gpt_summary = Ask_gpt( system=”Es un experto en DevSecOps. Sea conciso y práctico.”, user=( f”Un escáner de carga de archivos detectó estos tipos de archivos en un lote: ” f”{json.dumps(batch_summary)}. ” “En 3 o 4 oraciones, resuma qué tipo de proyecto se ve ” “y marque cualquier tipo de archivo que pueda requerir un escrutinio adicional.” ), max_tokens=220, ) print(f”\n💬 Análisis del proyecto GPT:\n{textwrap.fill(gpt_summary, 72)}\n”)