Aggiungendo i dati indesiderati alle password degli utenti prima che l'hashing influenzi la sicurezza?

6

Ho visto domande simili sul sito ma non esattamente.

Il più vicino era Modifica delle password prima di memorizzare dove la risposta accettata è riassunta da affermando che la trasformazione della password è spreco di cicli della CPU che potrebbero altrimenti andare in conteggio delle iterazioni più alte sul tuo hashing effettivo.

Anche se molto è corretto, considera il seguente scenario:

Supponiamo che l'applicazione utilizzi un host per il codice dell'applicazione e un altro host per il database / l'archivio. È possibile che in futuro il database venga compromesso, ma il codice dell'applicazione rimarrà segreto.

Se ciò accade, l'attaccante può tentare di rivelare le password degli utenti con una combinazione di forza bruta o elenchi di parole con espressioni regolari, qualcosa che è probabile che porti alla luce almeno alcune password e altro ancora con il passare del tempo.

Ovviamente, se hai scoperto che il tuo database è stato compromesso, avresti ripristinato tutte le password utente. Ma nel delta tempo tra il fatto che è stato effettivamente compromesso e tu lo scopri, l'attaccante ha un potenziale vettore di attacco per accedere agli account vulnerabili di alcuni utenti.

Quindi ho pensato, in particolare per questo scenario, non semplicemente aggiungendo alcuni dati spazzatura alle password degli utenti prima che l'hashing rendesse questo vettore di attacco molto più debole? (per esempio, rendi più difficile per un utente malintenzionato rivelare le password in tempo utile prima di scoprire cosa è successo e ripristinarle)

Non sto parlando di trasformazioni generali, ma piuttosto di appendere perché: 1. assicura che tutte le password rimangano uniche dopo la modifica, quindi non perdono entropia. 2. È un compito di calcolo relativamente a basso costo nel processo di un server che accetta i moduli di registrazione e le risposte di formattazione. 3. è semplice e non aggiunge complessità del codice che renderebbe l'applicazione più difficile da mantenere in futuro.

La stringa da aggiungere sarebbe una stringa costante, memorizzata in un posto nel codice dell'applicazione. Ovviamente, se il codice dell'applicazione viene compromesso, l'intera faccenda è inutile. Ma se solo gli hash delle password degli utenti sono stati compromessi:

  1. sarebbe davvero efficace nel rallentare un aggressore? (per esempio, impiega più tempo a rivelare le password degli utenti usando metodi moderni)

E, in generale:

  1. introdurrebbe qualche nuova vulnerabilità nel sistema?

Esempio:

Il server delle applicazioni ha una stringa costante: "! @ # $% ^ & () ,;" User A registra con la password "secretpassword" Il server concatena i due, creando: "! @ # $% ^ & () ,; secretpassword" Quindi bripta la nuova stringa e memorizza l'hash risultante nel database.

Per ogni tentativo di accesso futuro, la stringa costante verrà aggiunta all'inizio della password dell'utente (sul server) prima di ricalcolare l'hash.

Ora diciamo che ho un milione di utenti e un utente malintenzionato ha ottenuto un milione di hash di password che la mia applicazione utilizza per autenticare gli utenti. L'hacker sa anche che sto aggiungendo una stringa costante all'inizio delle password degli utenti sul server, infatti lo sto affermando pubblicamente sulla mia GUI del registro. Tuttavia, l'autore dell'attacco non conosce la stringa effettiva che sto aggiungendo.

l'account di User A è più sicuro (ad esempio, richiederebbe più tempo all'attaccante di rivelare la sua password originale "secretpassword" o trovare un modo per accedere al proprio account e acquisire i propri dati) o sarebbe lo stesso? qualche altro User X diventerebbe meno sicuro ora a causa di questo cambiamento, o nessun altro utente ne risentirebbe in peggio?

    
posta Kylee 25.04.2018 - 18:47
fonte

1 risposta

11

Quello che stai proponendo è chiamato pepper . È un altro tipo di sale, ma non è memorizzato. Questo non aiuta molto, perché in base al principio di Kerckhoffs , devi presumere che l'attaccante sappia tutto sul tuo sistema, eccetto il tasto. In questo caso particolare, si supponga che l'autore dell'attacco possa leggere ogni singolo file, ogni record nel database e ogni registro. Lui solo non conosce le password dell'utente.

Se il tuo sistema è aperto per la registrazione, l'utente malintenzionato potrebbe persino registrarsi, leggere il database, ottenere la propria password con hash e bruteforce la stringa segreta. Se la stringa è la stessa per ogni hash, non appena scopre la stringa segreta per la sua password, anche tutti i tuoi milioni di utenti sono compromessi.

Non puoi pianificare la sicurezza in base a qualcosa che perde immediatamente tutta l'usabilità per sempre una volta interrotta. Non appena viene scoperta la stringa segreta, tutte le tue password sono vulnerabili e non puoi cambiarle. Dovrai attendere tutti gli utenti per accedere, ottenere le password in chiaro per ognuno, cambiare la stringa segreta e rifilarla. Possono essere necessari mesi o anni per tutti i tuoi utenti che effettuano nuovamente il login. A meno che, naturalmente, non si passi alla modalità completamente insicura e memorizzi le password in chiaro anche da qualche parte.

Aumenterai la sicurezza utilizzando una strong funzione di hashing e aggiungendo altri round al processo di hashing, non aggiungendo nulla sulla password, o hash, o entrambi.

    
risposta data 25.04.2018 - 18:54
fonte

Leggi altre domande sui tag