---
title: "Compartir enlaces de forma segura: guía para desarrolladores | Blog de LinkPilot"
url: https://uselinkpilot.com/es/blog/secure-link-sharing-for-developers
description: "Guía práctica para equipos de ingeniería: cuándo usar enlaces de un solo uso, cómo generarlos desde un script e integrarlos en la incorporación y la CI."
lang: es
---

Seguridad (https://uselinkpilot.com/es/blog/category/security)

# Compartir enlaces de forma segura: guía para desarrolladores

Guía práctica para equipos de ingeniería: cuándo usar enlaces de un solo uso, cómo generarlos desde un script e integrarlos en la incorporación y la CI.

W. Miller (https://uselinkpilot.com/es/author/w-miller)26 de mayo de 2026 · Actualizado el 22 de octubre de 2026 · Sobre LinkPilot (https://uselinkpilot.com/es/about)

Si eres ingeniero, compartir secretos suele aparecer en tres momentos: la **incorporación**, la **entrega a proveedores** y la **respuesta a incidentes**. Aquí tienes la visión de un desarrollador sobre cuándo usar un enlace de un solo uso, cuándo no hace falta y cómo generarlo desde un script sin que el secreto se filtre al historial de la shell por el camino. Si quieres probar el mecanismo antes, el generador gratuito de enlaces secretos de un solo uso (https://uselinkpilot.com/es/tools/free-secret-link-generator) no necesita cuenta.

## ¿Cuándo debe usar un desarrollador un enlace de un solo uso?

Cuando hay una persona en al menos un extremo de la entrega y el valor no debe quedarse en ningún sitio después. Los casos habituales:

- La incorporación de un ingeniero nuevo con su primer juego de credenciales.
- Compartir una contraseña de administrador temporal durante un incidente.
- Entregar un token a un proveedor o colaborador externo que no debe estar en tu bóveda.
- Rotar una credencial cuyo valor antiguo debe dejar de servir enseguida.
- Enviar a un cliente la clave de API que le has generado.

## Cuándo no usar un enlace de un solo uso

- **Secretos entre máquinas.** Las variables de entorno de la CI (por ejemplo, los secretos de GitHub Actions (https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions)), los Secrets de Kubernetes (https://kubernetes.io/docs/concepts/configuration/secret/) y las credenciales dinámicas de Vault son la pieza adecuada ahí. Un enlace sirve para la entrega de una persona hacia esos sistemas.
- **Credenciales de equipo de larga duración.** Su sitio es un gestor de contraseñas.
- **Configuración pública.** No disfraces de secreto una configuración que no lo es. Usa un enlace normal.

La línea divisoria: si los dos extremos de la transferencia son máquinas, usa el almacén de secretos de tu plataforma. Si al menos uno es una persona, un enlace de un solo uso suele ser la pieza más limpia.

| Situación | Pieza adecuada |
| --- | --- |
| Primeras credenciales de un ingeniero nuevo | Enlace secreto de un solo uso |
| La pipeline de CI necesita un token de despliegue al ejecutarse | Almacén de secretos de la CI / variables de entorno |
| Un pod necesita la contraseña de una base de datos | Secret de K8s / operador de secretos externos |
| Acceso de equipo que usan cinco personas a diario | Gestor de contraseñas (bóveda compartida) |
| Un cliente necesita la clave de API que se le ha generado | Enlace secreto de un solo uso |
| Un secreto que hace falta dentro de un repositorio git | Nunca: haz referencia a un almacén de secretos y añade escaneo a la CI |

## Generarlo desde un script

LinkPilot tiene una API REST disponible en todos los planes, incluido el Free (los límites de uso cambian según el plan). Generar un secreto desde un script tiene este aspecto:

```bash
LP_KEY=lp_live_...

URL=$(curl -sS https://api.uselinkpilot.com/v1/secrets \
  -H "Authorization: Bearer $LP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payload": "'"$NEW_DB_PASSWORD"'",
    "expires_in": 3600,
    "burn_after_read": true,
    "passphrase": "'"$ONBOARDING_PASSPHRASE"'"
  }' | jq -r '.url')

echo "Secret link: $URL"
```

Pasa esa URL al canal de entrega que ya uses: un mensaje directo de Slack, el correo o el webhook de tu herramienta de incorporación.

### Mantener el contenido fuera de la lista de procesos

El fragmento anterior tiene un defecto clásico: al interpolar el contenido en `-d`, este acaba en la línea de comandos de curl, donde cualquier usuario local puede leerlo con `ps` mientras dura la petición. Construye el JSON con `jq` (https://jqlang.org/manual/) y pásalo por la entrada estándar con la opción `-d @-` de curl (https://curl.se/docs/manpage.html#-d):

```bash
set -euo pipefail

jq -n --arg payload "$NEW_DB_PASSWORD" \
      --arg pass "$ONBOARDING_PASSPHRASE" \
      '{payload: $payload, expires_in: 3600,
        burn_after_read: true, passphrase: $pass}' |
curl -sS https://api.uselinkpilot.com/v1/secrets \
  -H "Authorization: Bearer $LP_KEY" \
  -H "Content-Type: application/json" \
  -d @- | jq -r '.url'
```

Tres hábitos que conviene convertir en reflejo:

- Los valores llegan por variables de entorno o por la CLI de un gestor de secretos, nunca tecleados en una shell interactiva donde acaban en el historial.
- El script imprime el _enlace_, nunca el contenido.
- `set -euo pipefail`, para que una llamada fallida a la API no pase en silencio una URL vacía al paso siguiente.

## Plantilla de incorporación

Un esquema que funciona bien con los ingenieros nuevos el primer día:

1. El script de incorporación crea las cuentas y obtiene credenciales de un solo uso.
2. El script crea un enlace secreto por credencial, con expiración de 4 horas y una frase de contraseña común.
3. El script envía un correo con todos los enlaces y un mensaje directo de Slack con la frase de contraseña.
4. El ingeniero abre cada enlace y copia la credencial en su gestor de contraseñas.
5. Lo que siga sin leer al final del día se revoca y se vuelve a emitir cuando le venga bien.

Por qué estos parámetros: la expiración de 4 horas cubre una primera mañana normal sin dejar credenciales activas durante la noche; la frase de contraseña viaja por un segundo canal, así que un correo reenviado o mal entregado no supone ningún riesgo; y como cada enlace se destruye tras la lectura, el buzón del ingeniero termina el día solo con URL que ya no funcionan.

Díselo de forma explícita a la persona nueva: _«cada enlace funciona una vez; guarda el valor en tu gestor de contraseñas antes de cerrar la pestaña»_. El error más común en la incorporación es que el destinatario lea el secreto, cierre la pestaña y crea que puede volver más tarde.

## Un procedimiento de rotación

Para rotar una contraseña compartida de base de datos cuando quien la recibe es un colaborador externo o un compañero:

1. Genera la contraseña nueva y aplícala en el sistema de origen (la base de datos, la consola de la nube o donde esté la versión de referencia).
2. Actualiza antes tus propios consumidores (bóveda de la CI, secret de K8s, configuración de la aplicación) para que nada se rompa mientras se hace la entrega a la persona.
3. Crea un enlace de un solo uso para el valor nuevo: se destruye tras la lectura, expira en 1 hora y lleva frase de contraseña.
4. Entrega el enlace y la frase de contraseña por canales distintos.
5. Comprueba el evento de vista en el historial de auditoría. ¿No hay vista antes de la expiración? Revoca y vuelve a emitir; no reenvíes nunca el mismo enlace.
6. Confirma que la credencial antigua está desactivada en el origen.

Cada rotación lleva su propio enlace. Los enlaces son independientes por diseño: para la entrega es una ventaja, para el control no aporta nada, así que el _calendario_ de rotación vive en tu gestor o en tu procedimiento, no en la herramienta de enlaces.

## Respuesta a incidentes

Durante un incidente a menudo hay que rotar una credencial y repartir la nueva entre unas pocas personas, rápido. No la pegues en el canal del incidente: ese canal se guarda para el análisis posterior, y el secreto acabará en la exportación, en el documento de retrospectiva y en todos los sistemas de retención que vengan detrás.

- Rota la credencial en el sistema de origen.
- Genera un enlace secreto con expiración de 30 minutos.
- Deja el enlace en el canal; envía la frase de contraseña por mensaje directo.
- Después del incidente, confirma que el enlace se ha destruido o revocado.

Así, el análisis posterior contiene una URL que ya no funciona en lugar de una contraseña de administrador válida, y el historial de auditoría le da a quien revise la cronología un registro exacto, sin trabajo adicional: «credencial reemitida a las 14:32, leída a las 14:33».

Una nota sobre las vistas previas: los clientes de chat descargan las URL pegadas para mostrar una vista previa. Un enlace secreto bien diseñado lo resiste porque la vista previa hace un `GET` y para mostrar el secreto hace falta un `POST` explícito. El mecanismo completo está en escáneres de enlaces y secretos de un solo uso (https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets). Si estás evaluando una herramienta, pruébalo antes de un incidente, no durante uno.

## ¿Qué te dice el historial de auditoría?

Si un secreto se ha leído, cuándo y, de forma aproximada, desde dónde, y si alguien ha probado una frase de contraseña incorrecta. Cada secreto de LinkPilot lleva una cronología de eventos: created, viewed, failed_passphrase, burned, expired, revoked. Las vistas se registran con la marca de tiempo, una geolocalización aproximada cuando está disponible, el user agent y la IP convertida en hash (SHA-256 con una sal que rota cada día; la IP sin procesar no se guarda nunca). En la práctica, eso da tres respuestas en las que pueden apoyarse los scripts y los procedimientos:

- **Confirmación de entrega**: un evento viewed significa que la entrega se ha producido.
- **Detección de anomalías**: una ráfaga de failed_passphrase o una vista que no reconoces es la señal para rotar de inmediato.
- **Un registro limpio para las revisiones**: «entregado una vez, leído una vez, destruido» es una frase que gusta a los auditores.

## Límites: lo que los enlaces no resuelven

- **No son una bóveda.** Un enlace de un solo uso no gestiona el acceso continuo, los calendarios de rotación ni el inventario de quién tiene qué.
- **El enlace es la clave.** LinkPilot cifra el texto en tu navegador y nunca recibe la clave, pero esa clave viaja en la parte del enlace que va después del #, así que cualquiera que consiga el enlace completo puede leer el secreto, y si el enlace se pierde, el secreto no se puede recuperar. Los archivos adjuntos se cifran de la misma manera, pero sus nombres y tamaños no. Una expiración corta y la destrucción tras la lectura siguen siendo importantes. _Actualización del 29 de septiembre de 2026: este punto decía antes «no tienen cifrado de extremo a extremo», lo que era cierto hasta esa fecha._ Los detalles están en la página de arquitectura de seguridad (https://uselinkpilot.com/es/security-architecture).
- **No arreglan la dispersión de secretos en el código.** Las claves escritas a mano en los repositorios necesitan escaneo y rotación, no un medio de entrega mejor.
- **No pueden proteger el otro extremo.** Cuando una persona ha leído el valor, da por hecho que vive allí donde lo haya guardado.

Pruébalo gratis, sin registro

### Generador de enlaces secretos de un solo uso

Comparte una contraseña o una nota con un enlace que solo se abre una vez.

Abrir herramienta (https://uselinkpilot.com/es/tools/free-secret-link-generator)

## Lecturas relacionadas

- Cómo compartir claves de API de forma segura: https://uselinkpilot.com/es/blog/how-to-share-api-keys-securely
- Enlaces que expiran: por qué importan los plazos cortos: https://uselinkpilot.com/es/blog/expiring-links-security
- Arquitectura de seguridad de LinkPilot: https://uselinkpilot.com/es/security-architecture

## Referencias

- GitHub Docs, Using secrets in GitHub Actions (https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions).
- Kubernetes, Secrets (https://kubernetes.io/docs/concepts/configuration/secret/).
- jq, Manual (https://jqlang.org/manual/).
- curl, Manual page, `-d, --data` (https://curl.se/docs/manpage.html#-d).

## Herramientas para este artículo

Generador de enlaces secretos de un solo uso

Comparte una contraseña o una nota con un enlace que solo se abre una vez.
https://uselinkpilot.com/es/tools/free-secret-link-generator

Mensaje que se autodestruye

Envía una nota que desaparece después de leerse una vez.
https://uselinkpilot.com/es/tools/burn-after-read-secret

Generador de enlaces que expiran

Crea enlaces que dejan de funcionar en el momento que fijes.
https://uselinkpilot.com/es/tools/temporary-link

## Preguntas frecuentes

### ¿Puedo crear enlaces secretos desde un script?

### ¿Deben guardarse los secretos en variables de entorno en la CI?

### ¿Cómo gestiono la rotación en los scripts?

### ¿No acabará el secreto en el historial de la shell o en la lista de procesos?

### ¿Cómo confirmo que el destinatario ha recibido la credencial?

## LinkPilot envía un enlace secreto que desaparece en cuanto se abre.

Cifrado en tu navegador, se muestra una vez y después se destruye. Sin cuenta.

Crear un enlace secreto (https://uselinkpilot.com/es/tools/free-secret-link-generator)

## Sigue leyendo

Seguridad

### Enlaces secretos frente a gestores de contraseñas

Un gestor de contraseñas guarda las credenciales que el equipo reutiliza; un enlace secreto entrega una a una persona, una vez. Casi todos necesitan ambos.
https://uselinkpilot.com/es/blog/secret-links-vs-password-managers

Seguridad

### Escáneres de enlaces y secretos de un solo uso

Si un enlace de un solo uso se destruye con un GET, muere en la vista previa de Slack o del correo. Responde con metadatos y destruye solo al mostrarlo.
https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets

Seguridad

### Cómo compartir claves de API de forma segura

No pegues una clave de API en un chat ni en un correo. Envía un enlace secreto de un solo uso, cifrado en tu navegador, y rota la clave que ya pegaste.
https://uselinkpilot.com/es/blog/how-to-share-api-keys-securely

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Inicio",
        "item": "https://uselinkpilot.com/es"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Blog",
        "item": "https://uselinkpilot.com/es/blog"
      },
      {
        "@type": "ListItem",
        "position": 3,
        "name": "Compartir enlaces de forma segura: guía para desarrolladores",
        "item": "https://uselinkpilot.com/es/blog/secure-link-sharing-for-developers"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "@id": "https://uselinkpilot.com/es/blog/secure-link-sharing-for-developers#article",
    "headline": "Compartir enlaces de forma segura: guía para desarrolladores",
    "description": "Guía práctica para equipos de ingeniería: cuándo usar enlaces de un solo uso, cómo generarlos desde un script e integrarlos en la incorporación y la CI.",
    "inLanguage": "es",
    "datePublished": "2026-05-26",
    "dateModified": "2026-10-22",
    "image": "https://uselinkpilot.com/logo-512.png",
    "author": {
      "@type": "Person",
      "@id": "https://uselinkpilot.com/author/w-miller#person",
      "name": "W. Miller",
      "url": "https://uselinkpilot.com/es/author/w-miller",
      "worksFor": {
        "@type": "Organization",
        "name": "LinkPilot",
        "url": "https://uselinkpilot.com"
      }
    },
    "publisher": {
      "@type": "Organization",
      "name": "LinkPilot",
      "url": "https://uselinkpilot.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://uselinkpilot.com/logo-512.png",
        "width": 512,
        "height": 512
      }
    },
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://uselinkpilot.com/es/blog/secure-link-sharing-for-developers"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "¿Puedo crear enlaces secretos desde un script?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sí. LinkPilot ofrece una API REST en todos los planes, incluido el Free (los límites de uso cambian según el plan), para que generes secretos desde scripts de incorporación, trabajos de CI o herramientas internas. Cada llamada devuelve una URL que puedes pasar al correo, a Slack o a un SMS."
        }
      },
      {
        "@type": "Question",
        "name": "¿Deben guardarse los secretos en variables de entorno en la CI?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sí: siguen siendo la pieza correcta para la ejecución en CI. Usa enlaces secretos para la entrega entre personas (darle al ingeniero la credencial inicial que debe guardar en la bóveda de la CI), no para el camino entre máquinas."
        }
      },
      {
        "@type": "Question",
        "name": "¿Cómo gestiono la rotación en los scripts?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Genera una credencial nueva en el sistema de origen, ponla en un enlace de un solo uso, envía el enlace y deja que el destinatario la guarde en su gestor o en la bóveda de la CI. No reutilices enlaces entre rotaciones: cada rotación lleva su propio enlace."
        }
      },
      {
        "@type": "Question",
        "name": "¿No acabará el secreto en el historial de la shell o en la lista de procesos?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Ese es el riesgo real de un script ingenuo: mientras el comando se ejecuta, otros usuarios locales pueden ver sus argumentos con ps, y las shells interactivas escriben archivos de historial. Pasa el contenido por la entrada estándar (curl -d @-) y guarda las claves de API en variables de entorno, nunca en opciones de la línea de comandos."
        }
      },
      {
        "@type": "Question",
        "name": "¿Cómo confirmo que el destinatario ha recibido la credencial?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Consulta el historial de auditoría del secreto. Un evento de vista o de destrucción con su marca de tiempo confirma la entrega; un secreto que expira sin ningún evento de vista significa que la entrega ha fallado. Revoca y vuelve a emitir en lugar de hacer suposiciones."
        }
      }
    ],
    "inLanguage": "es"
  },
  {
    "@context": "https://schema.org",
    "@type": "SoftwareApplication",
    "@id": "https://uselinkpilot.com/#software",
    "name": "LinkPilot",
    "applicationCategory": "BusinessApplication",
    "operatingSystem": "Web",
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "url": "https://uselinkpilot.com",
    "offers": [
      {
        "@type": "Offer",
        "name": "Free",
        "price": "0",
        "priceCurrency": "USD",
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro",
        "price": "29",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "29",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency",
        "price": "299",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "299",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus",
        "price": "799",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "799",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro (yearly)",
        "price": "288",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "288",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency (yearly)",
        "price": "2988",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "2988",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus (yearly)",
        "price": "7980",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "7980",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Enterprise",
        "priceSpecification": {
          "@type": "PriceSpecification",
          "priceCurrency": "USD"
        },
        "url": "https://uselinkpilot.com/pricing"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "@id": "https://uselinkpilot.com/#organization",
    "name": "LinkPilot",
    "alternateName": "LinkPilot by TetraCore",
    "url": "https://uselinkpilot.com",
    "contactPoint": {
      "@type": "ContactPoint",
      "contactType": "customer support",
      "email": "support@uselinkpilot.com",
      "url": "https://uselinkpilot.com/support"
    },
    "parentOrganization": {
      "@type": "Organization",
      "@id": "https://tetracorehq.com/#organization",
      "name": "TetraCore",
      "url": "https://tetracorehq.com/"
    },
    "logo": {
      "@type": "ImageObject",
      "url": "https://uselinkpilot.com/logo-512.png",
      "width": 512,
      "height": 512
    },
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "sameAs": [
      "https://x.com/uselinkpilot",
      "https://www.linkedin.com/company/uselinkpilot",
      "https://facebook.com/uselinkpilot",
      "https://github.com/TetraCoreHQ/linkpilot-cli",
      "https://github.com/TetraCoreHQ/linkpilot-mcp",
      "https://www.npmjs.com/package/linkpilot",
      "https://www.npmjs.com/package/@uselinkpilot/sdk",
      "https://www.npmjs.com/package/@uselinkpilot/mcp",
      "https://chromewebstore.google.com/detail/linkpilot-short-links-and/mnmppadihpcncicldpkmgknhnjkondad",
      "https://addons.mozilla.org/en-US/firefox/addon/uselinkpilot/"
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "WebSite",
    "name": "LinkPilot",
    "url": "https://uselinkpilot.com",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "https://uselinkpilot.com/blog?q={search_term_string}",
      "query-input": "required name=search_term_string"
    }
  }
]
```