Capítulo 2
Tu identidad es un par de claves
Sin cuentas ni contraseñas: eres una clave secreta y su clave pública.
Sin formulario de registro, sin contraseña, sin policía de nombres de usuario. ¡Vamos a forjarte una identidad con un clic!
Sin formulario de registro. Nunca.
Todas las apps que has usado empiezan igual: elige un nombre de usuario, inventa una contraseña, confirma tu correo. Por detrás, una empresa te anota en su base de datos. Tu cuenta vive ahí, y existe solo mientras ellos lo digan.
Nostr se salta todo eso. Tu identidad no es una fila en la base de datos de nadie: es un
- una clave secreta (
): 32 bytes aleatorios que solo tú conoces, yclave privada Clave secreta (clave privada): El secreto de 32 bytes que demuestra que tú eres tú: quien lo tenga puede firmar eventos en tu nombre. Nunca lo compartas. - una clave pública (
): se calcula a partir de la secreta y puedes enseñársela al mundo sin miedo.pubkey Clave pública: Tu identidad pública: una clave secp256k1 de 32 bytes, mostrada como 64 caracteres hex o como npub. Puedes compartirla sin problema.
Piensa en un buzón con ranura. La clave pública es la dirección pintada en el frente: la pones en tus tarjetas para que la gente te encuentre. La clave secreta es la única llave que abre el buzón, y aquí hace algo todavía mejor: te deja sellar cartas con un sello que nadie más puede falsificar.
Ningún servidor las reparte. Las creas tú, en tu propio dispositivo, en una fracción de segundo. Hagámoslo ahora mismo.
La forja de claves
Forja un par de claves nuevo y mira cómo sus bytes en hex se reescriben como npub, un carácter bech32 a la vez.
88ce••••••••••••••••••••••••••••••••••••••••••••••••••••••••3858 32 bytes aleatorios. Quien los conozca SE CONVIERTE en ti.
173c1c47ef97731d55e45f8b5df6c13c5685b06acdbeb0cf8077a82eb07d8091 Se deriva de la secreta con matemáticas de secp256k1. Puedes compartirla sin miedo.
Hex → bech32, paso a paso
1. Bytes de datos
2. Los siguientes 5 bits
3. Buscar en el alfabeto bech32
- 0 q
- 1 p
- 2 z
- 3 r
- 4 y
- 5 9
- 6 x
- 7 8
- 8 g
- 9 f
- 10 2
- 11 t
- 12 v
- 13 d
- 14 w
- 15 0
- 16 s
- 17 3
- 18 j
- 19 n
- 20 5
- 21 4
- 22 k
- 23 h
- 24 c
- 25 e
- 26 6
- 27 m
- 28 u
- 29 a
- 30 7
- 31 l
4. El resultado crece
npub1Los últimos 6 caracteres son una suma de verificación: con un solo error de tipeo, las apps lo notarán.
Listo. Pulsa reproducir o avanza paso a paso para codificar la npub.
Pulsa el botón unas cuantas veces. Cada par de claves es completamente nuevo: hay unas 2256 claves secretas posibles, así que la probabilidad de que dos personas saquen la misma es, en la práctica, cero. No hace falta ningún registro central para que las claves sean únicas: las matemáticas lo hacen gratis.
Las claves forjadas en esta página son claves de prueba. Se generan en tu navegador y nunca se guardan ni se envían a ningún lado, pero trátalas como desechables: no las uses para una identidad real.
¿Por qué nadie puede adivinar mi secreto?
La clave pública se calcula a partir de la secreta usando una curva elíptica llamada
Aquí tienes una versión de juguete que sí puedes ver. Tu secreto es un número de saltos; la clave pública es el punto del reloj donde caes. Pruébalo y luego intenta ir hacia atrás.
El reloj de un solo sentido
Una versión de juguete de las matemáticas detrás de secp256k1. Elige un número secreto; el punto público es donde caes tras dar ese número de saltos de 17 en un reloj de 61 posiciones.
En un reloj de 61 puntos, adivinar hacia atrás lleva un parpadeo. En la curva real hay unos 1077 puntos. Todas las computadoras del planeta adivinando durante toda la vida del universo no harían ni un rasguño. Por eso puedes publicar tu clave pública en todas partes y dormir tranquilo.
Bajo el capó: secp256k1 y claves x-only Mostrar detalles
La operación real es una multiplicación escalar sobre una curva elíptica: P = k · G, donde k
es tu clave secreta (un entero de 256 bits entre 1 y el orden de la curva n − 1), G es el punto
generador fijo de la curva y P es el punto público. Recuperar k a partir de P es el problema
del logaritmo discreto en curvas elípticas, para el que no se conoce ninguna solución eficiente.
NIP-01 dice que las claves y las firmas
siguen BIP-340 (firmas Schnorr
sobre secp256k1). BIP-340 usa claves públicas x-only: solo se guarda la coordenada x de 32
bytes, y se asume que la coordenada y es par. Por eso una pubkey de Nostr tiene exactamente 64
caracteres hex en minúscula, y no los 66 de las claves “comprimidas” que quizá conozcas de otros
lados.
import { generateSecretKey, getPublicKey } from "nostr-tools/pure";
const sk = generateSecretKey(); // Uint8Array(32), de un CSPRNG
const pk = getPublicKey(sk); // 64 caracteres hex en minúscula (x-only)
console.log(pk);No cualquier valor de 32 bytes es una clave válida: la secreta tiene que ser menor que n (≈ 1,158 × 1077), y una clave pública tiene que ser una coordenada x que esté realmente sobre la curva.
npub y nsec: las mismas claves, escritas de forma más amigable
Las claves en bruto se escriben en hex: 64 caracteres de 0–9 y a–f. A las computadoras les
encanta el hex. A los humanos copiándolo y pegándolo en un chat… no tanto. Confunde un solo carácter
y, sin darte cuenta, estarás apuntando a otra persona (o a nadie).
Por eso
- tu clave pública se convierte en una
:npub npub: Una clave pública codificada en bech32 para que las personas puedan copiarla con seguridad: npub1… en lugar de 64 caracteres hex.npub1… - tu clave secreta se convierte en una
:nsec nsec: Una clave privada codificada en bech32 (nsec1…). Cualquiera que la vea puede hacerse pasar por ti.nsec1…
El prefijo te dice qué tienes entre manos (así notas cuándo estás a punto de pegar un secreto),
el alfabeto se salta caracteres que se confunden como 1, b, i y o, y los últimos seis
caracteres son un checksum: si cambias cualquier carácter, el software lo rechazará en vez de
usar en silencio la clave equivocada. Vuelve a la forja de más arriba y recorre la codificación paso
a paso: los bytes se reagrupan de 5 en 5 bits, y cada número de 5 bits elige una letra de un
alfabeto de 32.
Bajo el capó: la codificación NIP-19 Mostrar detalles
- Toma los 32 bytes de datos (256 bits).
- Reagrúpalos en palabras de 5 bits: 256 / 5 = 51,2, así que salen 52 palabras, y la última se rellena con bits en cero.
- Calcula un checksum BCH de 6 palabras sobre el prefijo (la parte legible por humanos,
npub) y las palabras. - Pasa las 58 palabras por el alfabeto
qpzry9x8gf2tvdw0s3jn54khce6mua7ly únelo todo:hrp + "1" + chars. Resultado: 63 caracteres para toda npub y toda nsec.
Las cadenas bech32 son solo para humanos. NIP-19 lo deja claro: no deben usarse dentro de eventos ni de mensajes de relay. En la red siempre va en hex (evento recortado al campo que nos interesa):
{
"kind": 1,
"pubkey": "7e7e9c42a91bfef19fa929e5fda1b72e0ebc1a4c1141673e2794234d86addf4e",
"content": "gm"
}import * as nip19 from "nostr-tools/nip19";
const npub = nip19.npubEncode(pk); // "npub1…"
const nsec = nip19.nsecEncode(sk); // "nsec1…" (sk es un Uint8Array)
const { type, data } = nip19.decode(npub); // type === "npub", data === pk (hex)NIP-19 también define note (un id de evento), además de “identificadores compartibles” que
empaquetan pistas extra como registros TLV (tipo-longitud-valor):
d de un evento direccionable).
Pruébalos todos en la herramienta de claves.
Dos NIPs relacionados: NIP-49 define
ncryptsecm/44'/1237'/<account>'/0/0). El índice de NIPs ahora marca NIP-06 como
no recomendado en favor de una sola nsec, así que trátalo como algo heredado que puedes encontrar en
wallets antiguas.
Tu clave es tu bolígrafo
Tener una clave secreta no solo sirve para ser alguien: sirve para demostrarlo. Cada publicación
que haces es un pequeño
Pruébalo con la clave que forjaste arriba. Luego cambia una sola letra.
Firmar es un sello que solo tú puedes poner
Una firma Schnorr prueba que la clave secreta de prueba aprobó exactamente este mensaje. Cambia una letra después de firmar y mira cómo falla la verificación.
Aún sin firmar.
Por eso Nostr no necesita un servidor de confianza: la prueba viaja con el mensaje. En el próximo capítulo vamos a desarmar un evento firmado byte a byte.
Bajo el capó: qué se firma en realidad Mostrar detalles
Nostr nunca firma tu texto tal cual. El evento se serializa como
[0, pubkey, created_at, kind, tags, content], se le aplica el hash id de 32 bytes, y lo que se firma con Schnorr BIP-340 es el id, lo que produce
una sig de 64 bytes (128 caracteres hex). Si cambias el contenido, cambia el id, y la firma vieja
ya no coincide.
import { finalizeEvent, verifyEvent } from "nostr-tools/pure";
const event = finalizeEvent(
{ kind: 1, created_at: Math.floor(Date.now() / 1000), tags: [], content: "gm" },
sk,
); // añade pubkey, id y sig
verifyEvent(event); // trueCuida tu nsec con tu vida (bueno, casi)
Esta es la otra cara de “ninguna empresa es dueña de tu cuenta”: ninguna empresa puede rescatarla tampoco.
- Quien consiga tu nsec se convierte en ti. Puede publicar, seguir y mandar DMs como tú, para siempre, y no puedes cambiar “tu contraseña”, porque no existe.
- Si pierdes tu nsec sin copia de seguridad, la identidad desaparece. Eso es la
, y es una de las concesiones honestas de Nostr (más sobre esto en el último capítulo).pérdida de claves Pérdida de claves: Perder o filtrar tu clave privada. Nostr no tiene botón de restablecer, así que en ambos casos la identidad se pierde.
Tu npub, en cambio, está hecha para compartirse: en tu web, en tu bio, en una camiseta. Practiquemos a distinguir una de la otra.
¿Quién recibe qué clave?
Cuatro personas te piden algo. Decide: ¿la compartes o te niegas?
- Tu amigo Bob te pide tu npub
“¿Cuál es tu npub? ¡Quiero seguirte!”
- “Soporte de Nostr” (DM) te pide tu nsec
“Tu cuenta fue marcada. Envía tu nsec en los próximos 10 minutos para verificarla.”
- Una presentadora de pódcast te pide tu npub
“¿Puedo poner tu npub en las notas del episodio para que los oyentes te encuentren?”
- Una app web nueva y reluciente te pide tu nsec
“¡Pega tu nsec aquí para reclamar 21.000 sats gratis!”
Las apps de verdad nunca necesitan que pegues tu nsec. Usa un
Bajo el capó: higiene de claves para desarrolladores Mostrar detalles
- Genera claves con un CSPRNG (
generateSecretKey()usacrypto.getRandomValues), nunca conMath.random()ni con el hash de algo adivinable. - Mantén las claves secretas como
Uint8Arrayen memoria y no las registres en logs. Mejor aún, delega en un firmante:window.nostr.signEvent()(NIP-07) o una conexiónbunker://(NIP-46). - Para respaldos, ofrece
ncryptsec(NIP-49) en lugar de la nsec en texto plano. No uses frases semilla NIP-06 en código nuevo: el índice de NIPs las marca como no recomendadas en favor de una sola nsec. - Acepta entradas tanto en hex como en NIP-19, pero guarda y transmite en hex; decodifica las URIs
nostr:(NIP-21) con el mismo decodificador de NIP-19.
Comprobación rápida
Lo esencial
- Tu identidad en Nostr es un par de claves secp256k1: una clave secreta que guardas y una clave pública que compartes.
- La clave pública se calcula a partir de la secreta, pero esa cuenta no se puede hacer al revés.
- npub y nsec son los mismos bytes que las claves en hex, reescritos en bech32 con un checksum que detecta errores de tipeo (NIP-19).
- Firmar prueba que un evento salió de tu clave; cualquiera puede verificarlo solo con tu clave pública.
- Nunca compartas tu nsec. No hay forma de restablecerla: si la pierdes o se filtra, esa identidad se acabó.