Seguretat

Xifratge d'extrem a extrem, amb les claus als teus propis dispositius

Happier manté una sessió de programació sincronitzada entre l'ordinador on s'executa i cada dispositiu des del qual la mires, i al mig hi ha un servidor de relay. Aquesta pàgina és l'arquitectura que hi ha sota aquesta frase: quina clau es genera on, què guarda realment el relay, què continua podent veure, i què canvia en un servidor configurat per desactivar el xifratge.

Com es xifra un missatge entre el teu telèfon i el teu ordinador

Un missatge que envies des del telèfon, dibuixat als tres punts pels quals passa. Tot el que l'agent respon fa el mateix camí en sentit contrari, segellat al teu ordinador abans de sortir-ne.

El teu telèfonSegellat aquí
El relayTransportat segellat
El teu ordinadorObert aquí
El teu telèfon
Segellat aquí. El missatge es xifra al dispositiu on l'has escrit, amb una clau que pertany a aquella sessió i a res més — 32 bytes aleatoris generats quan es crea la sessió, AES-256-GCM, un nonce nou per missatge. Després la clau de sessió es segella amb la clau pròpia del teu compte mitjançant un intercanvi X25519 efímer, i és la còpia segellada la que es lliura al relay.
El relay
Transportat segellat. El que el servidor escriu és una fila amb la forma { t: "encrypted", c: "…" } — base64, més un sobre de clau segellada del qual no té cap clau secreta. Pot encaminar aquella fila, comptar-la, guardar-la i tornar-la. No té res amb què obrir-la, i cap endpoint no li ho demana.
El teu ordinador
Obert aquí. La CLI obre la clau de sessió segellada amb la clau de compte que se li va donar quan vas connectar el terminal, desxifra, i passa el text pla a Claude Code, Codex, OpenCode o l'agent que s'estigui executant. La resposta fa el mateix viatge a la inversa, segellada abans de sortir.

Què emmagatzema el servidor de relay

El xifratge és una afirmació sobre el contingut, i una afirmació sobre el contingut és només mitja resposta. Aquí tens l'altra meitat, amb el mateix nivell de detall: les columnes que pot llegir un servidor que operi aquest relay sense cap clau.

El que guarda
Text xifrat, i un sobre de clau segellada
Una fila per missatge, que conté base64 i res més, més la clau de dades embolcallada de la sessió. L'embolcallat es fa en un dispositiu; cap ruta del servidor no en produeix cap.
Identificadors i forma
Identificadors de compte, de dispositiu i de sessió, una etiqueta aleatòria per sessió, números de seqüència, marques de temps i mides. Aquesta és la part que el xifratge no cobreix en cap sistema que sincronitzi, i val la pena ser-hi clar: el relay sap quant has enviat i quan.
De quin costat venia cada missatge
Cada missatge porta un rol — usuari, agent, esdeveniment o desconegut — subministrat pel client juntament amb el text xifrat. És una columna perquè una transcripció es pugui paginar i comptar sense obrir-la. En una fila xifrada el servidor no el pot deduir; només pot desar el que el client hi ha posat.
Una projecció d'activitat deliberadament petita
Si una sessió està sense llegir, quantes sol·licituds de permís esperen, quantes preguntes ha fet l'agent, si està pensant, com ha acabat l'últim torn. Cadascuna d'aquestes coses és estat derivat — un comptador, un indicador o una marca de temps que el client escriu a mesura que una sessió avança — mai ni una paraula del que s'ha dit. Existeix perquè un telèfon que ha estat tancat una hora mostri un distintiu correcte en el moment que l'obres, i comptar és el màxim que se li dona al servidor per fer-ho.
El que no guarda
El que has escrit, i el que l'agent ha respost
La transcripció és el text xifrat. No hi ha cap segona còpia, cap índex al servidor per sobre, ni cap pas de resum que en necessitaria un.
On s'executa la sessió
La ruta del projecte, el teu nom d'amfitrió, el teu directori d'usuari i la versió de la CLI són metadades de sessió, i les metadades es xifren amb la mateixa clau de sessió abans que la sessió es creï. Són camps dins d'un blob segellat, no columnes que el servidor pugui ordenar.
Les teves credencials de proveïdor
Un compte connectat — la credencial de Claude o de ChatGPT amb què s'executa una sessió — es segella al dispositiu abans de pujar-lo, amb una clau derivada per a aquest únic propòsit a partir del secret del teu compte. El relay desa un sobre i el torna als teus propis dispositius.
El teu repositori
El teu repositori no se sincronitza ni es replica mai. L'agent llegeix i escriu fitxers a l'ordinador on s'executa, i aquell ordinador continua sent l'única còpia completa. Quan demanes un fitxer, una carpeta o un diff, viatja pel mateix camí segellat que tota la resta — perquè l'has demanat, no perquè Happier en guardi una còpia.

Les teves claus de xifratge es creen al teu propi dispositiu

Hi ha un secret a l'arrel del teu compte, i es crea en un dispositiu — no l'emet cap servidor. Tota la resta se'n deriva mitjançant un arbre de claus: una arrel HMAC-SHA-512, i després un pas d'HMAC per cada element de ruta etiquetat. El parell de claus que obre les claus de sessió segellades surt d'aquest arbre sota l'etiqueta "content", i també en surt una clau separada per a cada altra mena de blob emmagatzemat, així que cap clau no fa dues feines.

Per això un navegador acabat d'estrenar pot iniciar sessió al teu compte i tot i així no mostrar-te res de la setmana passada. Iniciar sessió demostra al relay qui ets. Llegir una sessió antiga necessita la clau, i la clau no és al relay per enviar-la. Restaurar el dispositiu és el pas que la mou — des d'un dispositiu que ja la té, o des de la clau secreta que vas guardar.

També vol dir que el cas de pèrdua és real i val la pena dir-ho un cop: si tots els dispositius amb la sessió iniciada han desaparegut i la clau secreta ha desaparegut amb ells, les sessions xifrades no les podem recuperar ni nosaltres ni ningú. Un relay que les pogués tornar seria un relay que les podria llegir.

Enllaçar un dispositiu nou, i com hi arriben les teves claus

Afegir un dispositiu és el moment en què es mou material de claus, així que és el moment que val la pena entendre. Escanejar el codi QR genera una petició, i això és tot el que fa: l'aprovació passa en un dispositiu que ja té la sessió iniciada, i quan les dues pantalles mostren un codi curt de confirmació se suposa que els has de comparar abans d'aprovar.

El que fa l'aprovació en realitat és segellar la clau de contingut amb la clau pública del dispositiu que l'ha demanada, en un sobre que porta una clau d'emissor efímera i un nonce nou. Aquest sobre viatja pel relay com tota la resta. Connectar un terminal hi afegeix una lligadura més a sobre: la càrrega útil s'autentica contra un secret d'aparellament que ha viatjat dins del codi QR i no pel servidor, així que un relay que canviés la càrrega útil no podria produir una etiqueta coincident.

Política d'emmagatzematge: el xifratge d'extrem a extrem és el valor predeterminat

Tot el que hi ha més amunt descriu el valor predeterminat, i el valor predeterminat no és un suggeriment que el client pugui negociar amb el servidor. Un relay acabat d'instal·lar està configurat per exigir emmagatzematge xifrat d'extrem a extrem: una escriptura en text pla es rebutja amb un error de política en lloc d'acceptar-se en silenci. Els clients llegeixen la política de l'endpoint de features del servidor abans de crear una sessió, així que el mode en què està una sessió es va acordar abans del seu primer missatge.

Un operador de servidor té dos ajustos més disponibles. Un pot permetre que un compte triï, de manera que les sessions xifrades i les de text pla convisquin al mateix relay — cal tant la política opcional com el permís d'exclusió, i el permís està desactivat tret que l'operador l'activi. L'altre exigeix text pla, per a organitzacions que gestionen el xifratge a la capa d'infraestructura i necessiten que el servidor pugui llegir i processar el contingut de les sessions. Aquest últim és un compromís real i val la pena dir-ho sense suavitzar-ho: en una sessió en text pla el servidor pot llegir la transcripció. Aquest és el sentit de l'ajust.

El mode es fixa per sessió en el moment de crear-la, així que cap sessió no és mai meitat i meitat, i canviar el mode d'un compte canvia què passa amb les sessions noves en lloc d'arribar a les antigues. Res no es desxifra retroactivament, i res no es xifra retroactivament tampoc.

Les variables que estableixen totes tres coses, les opcions en repòs que hi ha a sota i els controls d'identitat que les envolten són la meitat que correspon a l'operador, i viuen a la pàgina d'autoallotjament per a equips.

Les notificacions push les envia el teu propi ordinador

Una notificació push és l'única cosa que se surt del model, perquè ha d'arribar a un telèfon que no té res obert. La resposta de Happier és que les envia el teu propi ordinador. El servidor desa els teus tokens de push; la CLI del teu propi ordinador els torna a llegir i envia la notificació ella mateixa, cosa que manté el relay fora d'un camí en què altrament se li hauria d'explicar el contingut.

El que porta la càrrega útil és deliberadament prim: el tipus d'eina o de petició, i una pista curta quan ajuda — un fitxer com ara src/file.ts, un nom d'ordre, un recompte com ara "3 questions". L'entrada bruta de les eines no s'hi posa. Prou per decidir si val la pena agafar el telèfon, en una pantalla que pot llegir qualsevol que et sigui al darrere.

Relay autoallotjat: les metadades també es queden al teu maquinari

Tot això es compleix en un relay que no executes tu. El motiu per executar el teu és la fila de dalt sobre identificadors i forma: el xifratge no amaga qui parla amb qui, ni amb quina freqüència, i en un relay teu aquell registre també és teu. Una sola ordre posa el relay en maquinari que és teu, i el camí passa a ser el teu dispositiu, el teu relay, el teu ordinador, sense res que no hi hagis desplegat tu.

Llegeix tu mateix el codi de xifratge

En aquesta pàgina no hi ha cap certificació perquè no n'hi ha cap per informar-ne, i una pàgina de seguretat que insinua un compliment que no té és pitjor que una que no l'esmenta. El que hi ha en lloc seu és el codi des del qual s'ha escrit cada frase de dalt, amb llicència MIT i llegible abans d'executar-lo: les primitives a packages/protocol/src/crypto, el xifratge de sessions a apps/cli/src/api/encryption.ts, la política d'emmagatzematge que el servidor aplica al seu endpoint de features, i l'esquema que mostra exactament quines columnes són en text pla.

Aquesta és també la resposta honesta a com hauries de tractar aquesta pàgina: com un mapa d'on mirar, no com una promesa per creure't. Llegeix els quatre fitxers, o executa el relay tu mateix i llegeix què anuncia als seus clients.

La referència del model de xifratge cobreix el mateix terreny com a procediment — què et demana la restauració, què vol dir cada mode d'emmagatzematge per a un compte, a quin flux recórrer quan un dispositiu encara no pot llegir una sessió.