Il reinghinging di una parte dell'hash della password aumenta la sicurezza?

0

Non sono un esperto di sicurezza ma sto cercando di capire come funzionano le attuali migliori pratiche per l'adozione di una politica di sicurezza per un sito Web che conterrà informazioni riservate.

In termini di utenti che tentano di accedere agli account utente attraverso la porta principale / schermata di accesso, sono felice di avere familiarità con informazioni sufficienti a rendere questo esercizio inutile.

Tuttavia voglio anche evitare la possibilità che il database possa essere violato e che una terza parte sia in possesso di tutte le password crittografate.

È a questo punto che non riesco a vedere alcun reale vantaggio nell'usare il metodo di crittografia MD5, MD5 + Salt, AES nei casi in cui il database è compromesso e tutte le chiavi necessarie per testare una password rispetto a qualsiasi l'hash viene mantenuto nel database.

Non sarei più sicuro se avessi preso un metodo di crittografia come MD5 e usato quello per crittografare la password dell'utente, e quindi prendere la stringa crittografata, e attraverso il codice, selezionare dire i primi n caratteri dell'hash e passare quello attraverso la crittografia MD5 e memorizza l'hash nel database?

vale a dire. prendi la password "password"

L'hash generato da MD5 sarebbe 5f4dcc3b5aa765d61d8327deb882cf99

Prendo ad esempio i primi 14 caratteri 5f4dcc3b5aa765 ed eseguo questo attraverso la crittografia MD5 per ottenere un nuovo Hash 316e881b8519579949391d6f8424decb che memorizzo nel database.

Solo il codice dovrebbe sapere quanti caratteri sono stati usati per ricodificare il primo codice hash. Qualsiasi hacker che non sia in possesso sia dei dati del database che del codice sorgente non sarebbe in grado di confrontare i codici hash utilizzando un set di regole del dizionario, anche se potrebbe aver identificato correttamente che viene utilizzata la crittografia MD5.

Tutti i metodi di crittografia che ho cercato fino ad ora sembrano memorizzare le chiavi di crittografia nel database che non sembra dare molta protezione da un errore di dump del database.

È del tutto possibile che io sia ingenuo qui e non capisco la prima cosa sulla sicurezza, ma qualsiasi consiglio da parte di persone che farebbe sarebbe apprezzato.

    
posta Martin C 10.08.2016 - 13:35
fonte

3 risposte

16

Only the code would know how many characters were being used to re-encrypt the first hash code.

E questo è dove si trova il problema. Proprio all'inizio, solo uno con accesso al codice lo sa. Ma per quanto tempo puoi mantenere questo segreto?
Puoi inavvertitamente pubblicare il tuo codice su GitHub, o parlarne con gli amici ed essere ascoltato ... non appena il segreto è uscito, il valore extra va via. E devi usare un metodo diverso - il che implica dover chiedere a tutti gli utenti di inserire nuovamente la password.

Si chiama Principio di Kerckhoff :

A cryptosystem should be secure even if everything about the system, except the key, is public knowledge.

Le uniche cose che dovrebbero avere bisogno di segretezza, sono le cose che puoi cambiare rapidamente. In questo modo puoi rispondere adeguatamente quando si verificano perdite segrete.

Detto questo, MD5 è obsoleto; considera l'utilizzo di bcrypt per l'hashing.

    
risposta data 10.08.2016 - 13:41
fonte
6

Si noti che gli algoritmi utilizzati per la convalida della password memorizzata rispetto a una password digitata devono essere algoritmi di hashing, non algoritmi di crittografia.

Il primo è a senso unico.

vale a dire. foo -> acbd18db4cc2f85cedef654fccc4a4d8 non può essere annullato, perché è possibile che acbd18db4cc2f85cedef654fccc4a4d8 sia l'hash di altri valori.

Quest'ultimo è bidirezionale.

foo -password-> cC0rVBKPXwDeUuXjyrZjLQ== -password-> foo

C'è solo un testo in chiaro, a condizione che venga utilizzata la stessa chiave.

Ora torna all'hash ...

Il punto di un hash della password non è quello di oscurare la password. Il punto di un hash per la password è quello di rendere le ricerche unidirezionali, tuttavia ciò rende vulnerabile la possibilità di indovinare le password. Cioè, un utente malintenzionato potrebbe provare la password foo offline tramite lo stesso algoritmo per scoprire se ha hash a acbd18db4cc2f85cedef654fccc4a4d8 . Se è così, possono provare un accesso online.

Perché un utente malintenzionato riesca a farlo ragionevolmente velocemente, usi bcrypt in modo che ci voglia dire 10.000 volte di più per testare ogni password guess.

Questo è ciò che ferma un utente malintenzionato, non sicurezza attraverso l'oscurità offuscando il calcolo dell'hash. Probabilmente, un abile attaccante sarebbe in grado di ottenere l'algoritmo della password in qualche modo - sia inserendo il codice base, sia scoprendo se è fuoriuscito da qualsiasi parte (ad esempio in un sistema open source non si ha alcuna possibilità). Nel peggiore dei casi, un utente malintenzionato potrebbe registrarsi per più account sul proprio sistema e osservare come si hash la propria password. Prima o poi lo capiranno, e ci sono molte probabilità che questo accada molto prima di quanto possano fare le loro ipotesi di password attraverso un algoritmo sicuro come bcrypt.

    
risposta data 10.08.2016 - 15:32
fonte
3

Utilizzare i metodi standard di dire CrypticHash (password, sale, round / costo) è un approccio molto più sicuro per numerose ragioni, anche se il codice sorgente e il database sono trapelati.

Nel tuo approccio sarebbe abbastanza facile attaccare. Tutto quello che dovrei fare, una volta che il tuo codice / database è trapelato, è brute-force su un set di caratteri esadecimali (16 caratteri), con lunghezza 14 finché trovo "5f4dcc3b5aa765" come una corrispondenza, che potrebbe richiedere del tempo, ma la mente tu, md5 sarebbe abbastanza veloce per rendere possibile tutto ciò. Quindi tutto quello che devo fare è trovare QUALSIASI hash md5 che inizi con "5f4dcc3b5aa765xxxxxxxxxxxxxxxxxx" e questo sarebbe ancora più facile da trovare con le tabelle arcobaleno.

    
risposta data 10.08.2016 - 15:02
fonte

Leggi altre domande sui tag