È buona norma memorizzare informazioni su una sottochiave all'interno di un hash?

1

Recentemente ho scritto una piccola libreria javascript che consente di verificare gli hash delle password del server delle identità in nodeJS. Mentre stavo facendo la ricerca ho imparato che il tipo di hash, iterazioni e lunghezza del sale è codificato aggiungendo byte extra all'hash finale che viene dato in base64 in seguito.

In particolare l'ordine è sempre lo stesso e leggendo i primi 25 byte di dati si impara tutto su come la sottochiave è stata codificata. Ecco un esempio che include l'esempio di inserimento.

this.writeNetworkByteOrder(outputBytes, 1, 1);
this.writeNetworkByteOrder(outputBytes, 5, 10000);
this.writeNetworkByteOrder(outputBytes, 9, salt.length);

function() writeNetworkByteOrder(buffer, offset, value){
            buffer[offset + 0] = value >> 0;
            buffer[offset + 1] = value >> 8;
            buffer[offset + 2] = value >> 16;
            buffer[offset + 3] = value >> 24;
}

Questa pratica è comune? Dovrei provare ad evitare di usare la password predefinita fornita con il server di identità? Quanto viene dato conoscendo queste informazioni?

Perché questo non è un duplicato

La mia domanda riguarda specificamente la codifica che si verifica sull'hash risultante. Questo è l'hash base64 che è il risultato dell'operazione del server di identità. Fornendoti sapere che l'hash è base64 puoi leggere prontamente il tipo di crittografia, le iterazioni e la lunghezza del sale direttamente da esso. Voglio sapere come e se questo è sicuro e se è considerato una buona pratica di sicurezza.

    
posta li x 17.04.2018 - 17:06
fonte

1 risposta

2

TL; DR sì, quando si tratta di proteggere la password sul server è sicuro memorizzare i parametri di configurazione come il conteggio delle iterazioni e la dimensione sale / sale sul server. Come menzionato nella sessione di chat, è comune farlo per es. bcrypt, utilizzando un formato testuale diverso.

La domanda è se è sicuro memorizzare i parametri di configurazione dell'algoritmo, non solo l'algoritmo. E sì, questo è sicuro. I parametri di configurazione non forniscono alcuna informazione sulla password utilizzata, quindi archiviarli con il sale (e possibilmente l'hash della password, per la verifica della password) non perdono informazioni riservate a un utente malintenzionato.

E proprio come il principio di Kerckhoff si applica all'algoritmo, è valido anche per questo tipo di parametri di configurazione. Fortunatamente, se questi parametri vengono modificati, la verifica della password fallirà semplicemente.

La codifica di Base 64 non ha alcun ruolo nel determinare la sicurezza, quindi non viene considerata questa risposta.

Per altre funzioni / parametri di configurazione il parametro potrebbe richiedere una protezione aggiuntiva. Ad esempio, la dimensione di un tag di autenticazione nella crittografia autenticata (o semplice HMAC) non dovrebbe essere alterata da un avversario. Questo potrebbe essere un problema nella negoziazione del protocollo.

Allo stesso modo se il conteggio dell'iterazione / fattore di lavoro viene comunicato ad un client (per offload parziale del lavoro, per esempio), allora si potrebbe voler proteggere il conteggio delle iterazioni rispetto alle modifiche. Ma questi tipi di parametri sono generalmente disponibili solo sul server e le password / hashes send sono generalmente protette da una connessione TLS che dovresti usare .

Personalmente preferisco semplicemente memorizzare una versione singola invece dei parametri espliciti. I parametri sono quindi specifici per una versione (hardcoded), quindi non devo analizzare / convalidare alcuna informazione diversa dalla versione. Questo è meno dinamico di memorizzarli separatamente, ma spesso la complessità è tanto un problema quanto la rigidità.

    
risposta data 25.04.2018 - 19:18
fonte

Leggi altre domande sui tag