18 de octubre de 2025

📌 ¿Qué es el Padrón Reducido de la SUNAT?

Es una base de datos pública que la SUNAT (Superintendencia Nacional de Aduanas y de Administración Tributaria) actualiza diariamente y que contiene información de todos los contribuyentes inscritos en el RUC (Registro Único de Contribuyentes).

Incluye datos como:

  • Número de RUC
  • Nombre completo o razón social
  • Tipo de contribuyente (persona natural con negocio, empresa, entidad pública, etc.)
  • Estado de contribuyente (activo, baja, suspensión, etc.)
  • Condición de domicilio (habido, no habido, etc.)
  • Actividad económica principal

La Sunat permite descargar toda esta información de miles de ciudadanos en un solo archivo zip

https://orientacion.sunat.gob.pe/padron-reducido-del-ruc-para-descarga


📌 ¿Por qué es público?

El RUC en Perú no es considerado un dato privado, sino información pública de registro administrativo, parecida a un registro mercantil en otros países.

Razones:

  1. Transparencia tributaria → Cualquier persona que emite comprobantes de pago debe estar inscrita en el RUC.
  2. Seguridad comercial → Las empresas y personas necesitan verificar si su proveedor/cliente existe y está habilitado para emitir facturas.
  3. Control ciudadano → Permite detectar empresas fantasmas o negocios irregulares.

Por eso la SUNAT lo publica y cualquiera puede descargar el padrón completo o consultar un RUC desde la web.


📌 ¿Y qué pasa con los datos personales (nombres)?

Aquí está lo delicado.

  • Si eres persona natural con negocio, tu nombre completo aparece tal cual en el padrón junto a tu RUC.
  • Si eres persona jurídica (empresa), aparece solo la razón social.

En teoría no hay violación porque el nombre es información registral pública vinculada a una actividad económica, no al ciudadano como tal.


📌 Relación RUC ↔ DNI

Efectivamente, en la práctica:

  • El RUC de personas naturales con negocio casi siempre es su DNI con un dígito adicional al final (un código verificador).
  • Eso significa que, si tienes el RUC, puedes deducir el DNI de esa persona fácilmente.

Eso genera preocupaciones de privacidad, porque aunque SUNAT argumenta que es información pública, en la práctica se expone la identidad civil de millones de personas.

USO SIMPLE y PELIGROSO

Cualquiera con una PC y una terminal puede hacer lo siguiente y disponer de nuestros datos nombres completos y dni ya que esta integrado en el mismo ruc, asi también buscar personas relacionadas por apellido o algunos nombres y asi completar sus datos completos.

Vea un simple ejemplo de como se hace:

Bueno como se aprecia en el video de este modo sin perder mucho tiempo es posible llegar a los dnis de cualquier persona (solo ignorando los 2 primeros digitos y el ultimo digito del ruc), claro por ahi la norma o ley exige que uses los datos de forma adecuada, pero el delincuente que descargue el padron reducido no va respetar la norma o ley en lo mas minimo se aprovechara y con ello tendra nuestros importantes datos.

Con los cuales podran saber hasta nuestro lugar de votación o hacer suplantación de identidad en algún registro online que solo pida dni como dato comprobante, la seguridad ya a sido vulnerada y lo hace el mismo estado.


📌 Entonces, ¿es ilegal?

  • No es ilegal en Perú porque la SUNAT lo regula mediante la Ley del RUC (Decreto Legislativo N.° 943) y normas de transparencia.
  • Pero sí hay debate sobre la protección de datos personales (Ley N.° 29733). La diferencia está en que el RUC es información registral obligatoria y pública, mientras que el DNI como tal sí es un dato sensible que RENIEC no puede exponer libremente.

📌 Que podemos hacer con ese archivo zip que nos da la Sunat

Desde python con un simple script pasaremos todo a SQL y podremos subir a alguna base de datos:

Migracion.py

#!/usr/bin/env python3
import csv
import sys

# === Configuración ===
INPUT_FILE   = "padron.txt"
OUTPUT_SQL   = "padron_big.sql"
ERRORS_FILE  = "errores_big.txt"
TABLE_NAME   = "padron"
PROGRESS_EVERY = 100_000  # progreso por consola

# Aumentar límite de tamaño de campo
csv.field_size_limit(sys.maxsize)

def es_ruc_valido(s: str) -> bool:
    s = s.strip()
    return len(s) == 11 and s.isdigit()

def sql_escape(s: str) -> str:
    # Escapar comillas simples para SQL (' -> '')
    s = s.replace("'", "''")
    # Eliminar backslashes que rompen el SQL
    s = s.replace("\\", "")
    return s

def main():
    total_leidas = 0
    total_insertadas = 0
    total_ignoradas = 0
    header_skipped = False

    with open(INPUT_FILE,  "r", encoding="latin-1", errors="replace") as infile, \
         open(OUTPUT_SQL,  "w", encoding="utf-8")                 as outsql, \
         open(ERRORS_FILE, "w", encoding="utf-8")                 as err:

        reader = csv.reader(infile, delimiter="|")

        # Encabezado SQL
        outsql.write("-- Archivo generado automáticamente (compatible con BigDump)\n")
        outsql.write("SET autocommit=0;\nSTART TRANSACTION;\n")
        outsql.write(f"CREATE TABLE IF NOT EXISTS {TABLE_NAME} (\n")
        outsql.write("  ruc VARCHAR(11) PRIMARY KEY,\n")
        outsql.write("  nombre VARCHAR(255)\n")
        outsql.write(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n")

        for line_num, row in enumerate(reader, start=1):
            total_leidas += 1

            # Detectar cabecera
            if not header_skipped:
                if len(row) >= 2 and row[0].strip().upper() == "RUC":
                    err.write(f"Línea {line_num}: cabecera detectada y omitida.\n")
                    header_skipped = True
                    continue
                header_skipped = True

            try:
                if len(row) < 2:
                    total_ignoradas += 1
                    err.write(f"Línea {line_num}: ignorada por columnas insuficientes ({len(row)}). Contenido parcial: {row}\n")
                    continue

                ruc_raw = row[0].strip()
                nombre_raw = row[1].strip()

                if not es_ruc_valido(ruc_raw):
                    total_ignoradas += 1
                    err.write(f"Línea {line_num}: ignorada por RUC inválido ('{ruc_raw}').\n")
                    continue

                if not nombre_raw:
                    total_ignoradas += 1
                    err.write(f"Línea {line_num}: ignorada por nombre vacío (RUC {ruc_raw}).\n")
                    continue

                # Escapar y escribir INSERT único por línea
                ruc = sql_escape(ruc_raw)
                nombre = sql_escape(nombre_raw)
                outsql.write(f"INSERT IGNORE INTO {TABLE_NAME} (ruc, nombre) VALUES ('{ruc}','{nombre}');\n")

                total_insertadas += 1

                if total_leidas % PROGRESS_EVERY == 0:
                    print(f"Procesadas {total_leidas:,} líneas... Insertadas: {total_insertadas:,}  Ignoradas: {total_ignoradas:,}")

            except Exception as e:
                total_ignoradas += 1
                err.write(f"Línea {line_num}: error inesperado: {e}. Contenido: {row}\n")

        outsql.write("COMMIT;\n")

        err.write("\n===== RESUMEN =====\n")
        err.write(f"Total de líneas leídas: {total_leidas}\n")
        err.write(f"Total insertadas (sentencias SQL): {total_insertadas}\n")
        err.write(f"Total ignoradas: {total_ignoradas}\n")

    print("----------")
    print(f"Listo ✅  SQL: {OUTPUT_SQL}")
    print(f"Errores/log: {ERRORS_FILE}")
    print(f"Líneas leídas: {total_leidas:,}")
    print(f"Insertadas:    {total_insertadas:,}")
    print(f"Ignoradas:     {total_ignoradas:,}")

if __name__ == "__main__":
    main()

Con eso ya tendremos el ultimo padrón convertido a SQL y podremos subirlo a nuestro server con MYSQL y PHP para hacer cuanta consulta queramos.

Este script es meramente educativo pero volvamos a lo puntual esto lo puede hacer cualquiera y no siempre dara buen uso a nuestra información.


👉 En resumen:
La SUNAT publica el padrón reducido porque el RUC es un registro público obligatorio, necesario para la economía formal.
Lo polémico es que, por la estructura del RUC, se puede inferir el DNI de los ciudadanos, lo cual abre la puerta a usos indebidos (fraudes, spam, estafas).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *