🔑 Chiavi e segreti - Store condiviso¶
Ogni motore di sicurezza di HIX (JWT, sessioni, token firmati, CSRF, resource IDs...) ha bisogno di una chiave segreta per firmare i dati. Per evitare di ripetere setup per modulo, HIX fornisce un unico store di chiavi:
HIX_KeySet( cName, cVal )- salva una chiave con un nome.HIX_KeyGet( cName, cDefault )- la legge (o ritorna il default).HIX_KeyExists( cName )- controlla se esiste.
I motori leggono sempre tramite HIX_KeyGet(). Non gli importa da dove arriva la chiave - solo che sia caricata prima di oSrv:Start().
Chiavi usate da HIX¶
| Nome | Consumato da | Default di fallback |
|---|---|---|
csrf |
CSRF (HIX_CsrfMakeToken/Valid) |
"H!x@CSRF@2026" |
resource |
Resource IDs (HIX_ResourceHtml) |
"H!x@RES@2026" |
jwt |
JWT (HIX_JwtEncode/Validate) |
"H!x@JWT@2026" |
session |
Sessioni (seed per cifratura SID) | "H!x@SESSION@2026" |
token |
Token firmati generici | "H!x@TOKEN@2026" |
I default esistono affinché la libreria si avvii; cambiali sempre in produzione.
Profilo HixStyle - caricamento automatico da config.json¶
In modalità hixstyle (config.json presente alla root del progetto), il bootstrap del server legge la sezione keys subito dopo aver applicato la configurazione Harbour e pubblica ogni entry nello store.
{
"sets": { "language": "IT", "dateformat": "dd/mm/yyyy" },
"dbf": { "rddname": "DBFCDX" },
"keys": {
"csrf": "T7$k9pM2!vX4qL8w",
"resource": "res-2026-abc",
"jwt": "hix-jwt-prod-2026",
"session": "sess-seed-random",
"token": "tok-2026-xyz"
}
}
Al primo avvio, HIX genera config.json con questa sezione già seminata (con i default di fallback). Devi solo sostituire i valori con i tuoi e riavviare - niente ricompilazione.
Profilo standalone - senza config.json¶
Se preferisci avviare senza config.json (avvio completamente programmatico), pubblica le chiavi tu stesso prima di oSrv:Start():
PROCEDURE Main()
LOCAL oSrv := THixServer():New()
// Carica le chiavi da dove preferisci: file .ini, variabili d'ambiente,
// KMS, hardcoded per lo sviluppo…
HIX_KeySet( "csrf", GetEnv( "HIX_CSRF_KEY" ) )
HIX_KeySet( "jwt", GetEnv( "HIX_JWT_KEY" ) )
HIX_KeySet( "session", GetEnv( "HIX_SESS_KEY" ) )
oSrv:Start()
IF oSrv:hThread != NIL ; hb_threadJoin( oSrv:hThread ) ; ENDIF
RETURN
I motori vedono esattamente la stessa cosa - l'unica differenza è da dove arriva il valore.
Profilo legacy - setup per modulo¶
I setup storici (HIX_MwJwtSetup, HixMwSessionSetup, HIX_TokenSetSecret, …) funzionano ancora. Internamente delegano a HIX_KeySet con il nome di chiave appropriato.
HIX_MwJwtSetup( "my-jwt-secret", 3600 ) // equivalente a HIX_KeySet("jwt", ...)
HIX_TokenSetSecret( "tok-2026" ) // equivalente a HIX_KeySet("token", ...)
Coesistono con le altre due modalità. Se mescoli le sorgenti, vince l'ultima scrittura.
Precedenza¶
- Bootstrap HixStyle - viene eseguito per primo:
HIX_KeysLoadFromAppConfig()copia la sezionekeysnello store. - Setup per modulo - qualsiasi
HIX_*Setup()chiami dopo. HIX_KeySet()manuale - il modo più diretto; sovrascrive quanto sopra.
Regola pratica: se un valore è in config.json e chiami anche
HIX_MwJwtSetup("another") in Main(), vince l'esecuzione successiva.
Ispezione sicura¶
Per fare debug o esporre lo stato dello store senza rivelare segreti:
Ogni valore è mascherato mostrando solo i primi 2 e gli ultimi 2 caratteri. È lo stesso hash che puoi emettere da un endpoint di stato interno.