Si tratta di un metodo di hashing / offuscamento auto laminato? Riesci a riconoscere il modello?

46

Un sistema che stiamo introducendo nell'organizzazione non utilizza alcuna funzione di hashing tradizionale che riesco a trovare. Sono stato assegnato a "approvarlo" con il test black-box.

Sospetto che le password vengano semplicemente offuscate o crittografate (non con hash) in quanto la lunghezza del risultato cambia con la lunghezza della password (anche se c'è un minimo, a quanto pare - forse padding?).

Ecco alcuni dati:

password   : result
1          : TG3432WB7VU=
11         : r8ahLkJGWbY=
111        : E7fXdNqEWAA=
11111111   : FIcx3a00R4eGhFyHjD56qw==
1111111111 : FIcx3a00R4evxqEuQkZZtg==
2111111111 : GPwnH80qEACvxqEuQkZZtg==

Il risultato è ovviamente base64, ma non decodifica in nulla leggibile. Prima di sapere che la lunghezza del risultato è cambiata, ho provato a prendere i byte decodificati e a trattarli come MD5 e altre funzioni di hashing, ma ovviamente non è saltato fuori. Ora che so che il risultato cambia di lunghezza, sto considerando altre alternative, peggio. Di nota sono le due parti in grassetto sopra: sono identiche in due password diverse. Quindi, ogni 8 byte viene elaborato indipendentemente (perché?) Oppure c'è una sostituzione polialfabetica in corso (?).

Aggiornamento:

Qualsiasi carattere, inclusi i caratteri Unicode, è accettato dal sistema per le password. La ripetizione di un carattere di 3 byte per 8 volte comporta un "hash" lungo 24 byte.

    
posta coldfused 24.02.2016 - 20:37
fonte

4 risposte

58

Ho il sospetto che questo sia un metodo auto-laminato, o almeno molto obsoleto. È molto debole per gli standard moderni e non dovrebbe essere usato per proteggere qualcosa di importante.

Le password brevi potrebbero essere violate con non più di 2 ^ 64 tentativi di forza bruta, il che è del tutto possibile anche con un normale computer. Se entrambe le metà del risultato sono indipendenti, anche con password abbastanza lunghe, i tentativi di forza bruta 2 * 2 ^ 64 potrebbero spezzarla (quindi 2 ^ 65 tentativi). Ci sono probabilmente ulteriori punti deboli nell'algoritmo che lo rendono più debole di quanto descritto qui.

Un altro punto interessante da testare sarebbe 2111111111 e vedere se la seconda parte del risultato rimane la stessa. Se la seconda parte non cambia, questo è sicuramente un algoritmo debole.

Modifica:

Visto che i risultati del test 2111111111 sono gli stessi per la seconda metà, questo è sicuramente un algoritmo debole e non dovrebbe essere usato per proteggere qualcosa di sensibile! Ho incluso il confronto rilevante di seguito:

  • 1111111111 : FIcx3a00R4evxqEuQkZZtg==
  • 2111111111 : GPwnH80qEACvxqEuQkZZtg==

Modifica

Un altro test interessante sarebbe quello che Ricky Demer suggerisce di seguito:

The next thing to check is that it handles the 8-byte blocks identically. ​ What are the "hashes" of aaaaaaaabbbbbbbbc and bbbbbbbbaaaaaaaac? ​ ​ ​ ​ – Ricky Demer Feb 25 at 6:44

Se gestisse i blocchi da 8 byte in modo identico, è anche peggio per le password anche lunghe, indipendentemente dalla lunghezza. Richiederebbe solo 2 ^ 64 tentativi di forza bruta come indicato da Neil nei commenti. Una volta che qualcuno ha fatto un tavolo su cosa calcola ciascuna possibilità, questo algoritmo sarebbe praticamente inutile. Probabilmente ci sono ancora più punti deboli di questo algoritmo che rimane da scoprire.

Bottom line:

Non è consigliabile utilizzare questo algoritmo indipendentemente dai risultati dell'ultimo test. Abbiamo già visto abbastanza per sapere che è debole. Qualcosa con uno schema di crittografia / hash bit più elevato, sale, tempo di calcolo lungo ecc ... sarebbe molto meglio, e consiglierei di andare con uno dei metodi già testati. La crittografia / hashing auto-rollata non ha avuto il vantaggio di test approfonditi che hanno avuto la maggior parte dei principali metodi di streaming.

    
risposta data 24.02.2016 - 21:26
fonte
10

Il fatto che la lunghezza delle stringhe codificate dipenda dalla lunghezza delle rispettive password suggerisce una debolezza molto peggiore: le password sembrano essere offuscate piuttosto che l'hash .

Questo significa che chiunque conosca le parti interne del sistema potrebbe essere in grado di decifrare istantaneamente qualsiasi passowrd! Le implicazioni sono numerose: devi fidarti degli sviluppatori che hanno mai lavorato sul sistema, il codice sorgente deve essere tenuto segreto per sempre (ecco perché stai rivedendo una scatola nera) ecc.

Non importa quanto sia buono l'algoritmo di offuscamento (e 2 64 non è esattamente stellare). È rotto in base alla progettazione.

    
risposta data 25.02.2016 - 14:14
fonte
4

Kerckhoffs's_principle si applica ovviamente: Un cryptosystem dovrebbe essere sicuro anche se tutto ciò che riguarda il sistema, ad eccezione della chiave , è di dominio pubblico.

Questo di per sé dovrebbe essere sufficiente per poter dire "Non posso approvare questo sistema senza ulteriori informazioni".

Dai tuoi esempi, sembra che l'input sia diviso in blocchi di 8 caratteri / byte, ogni blocco viene sottoposto a hash singolarmente e gli output messi insieme, quindi l'intero risultato è codificato in base64.

Questo non va bene. La maggior parte delle password che hanno più di 8 caratteri sono più lunghe di alcuni caratteri. Questo significa che un attaccante può rompere il secondo blocco molto facilmente. E quando conosci il secondo blocco, hai un strong suggerimento su cosa può contenere il primo blocco.

La comunità cripto ha scoperto questo decennio fa e non eliminerà più i blocchi hash in modo indipendente. Ciò significa che questi programmatori sono NOT aggiornati su crypto.

L'unica buona notizia è che una modifica di un singolo carattere nella password cambia l'intero blocco di output. Questo probabilmente significa che in realtà stanno tagliando le password e non le stanno solo offuscando. Tuttavia, con le debolezze di cui sopra, la migliore funzione di hash del mondo non può salvare l'algoritmo.

    
risposta data 26.02.2016 - 10:18
fonte
2

Sembra un semplice codice a blocchi e sicuramente non è qualcosa che vorresti utilizzare. Confrontalo con le password di hashing, semplicemente codificandole / confondendole con, ad esempio, base64. Questo non è qualcosa che vorresti mai fare. Se qualcuno applica persino la crittanalisi semplice, potrebbe facilmente scoprire che i loro caratteri sono solo 64 base64.

    
risposta data 25.02.2016 - 16:39
fonte

Leggi altre domande sui tag