La sicurezza della funzione PASSWORD in MySQL

5

La funzione PASSWORD in MySQL può essere tradotta nel codice in php:

function mysql_password($string){
    $pass = strtoupper(
            sha1(
                    sha1($string, true)
            )
    );
    $pass = '*' . $pass;
    return $pass;
}

che restituisce un hash di 41 caratteri.

Sono preoccupato per questa funzione perché se eseguo:

SELECT PASSWORD('securepassword');

su qualsiasi dispositivo restituisce lo stesso hash:

*214C2FAF32F109AE748170BFABDDFB9B05889E64

Sicuramente questo significa che se il mio database viene violato un infiltrato può facilmente creare una tabella arcobaleno con un carico di password comuni e abbinare gli hash - non è qualcosa di cui dovrei preoccuparmi?

Speravo che la funzione PASSWORD fosse unica per ogni dispositivo? Come faccio a renderlo unico per ogni dispositivo?

    
posta maxisme 22.02.2017 - 13:22
fonte

3 risposte

3

Surely that means that if my database is breached an infiltrator can easily create a rainbow table with a load of popular passwords and match the hashes.

È corretto.

Gli hash non differiscono da utente a utente. Ciò significa che un utente malintenzionato può calcolare un hash una volta e controllarlo rispetto agli hash di tutti gli utenti. Un sale lo renderebbe impossibile.

In effetti, gli hash non differiscono affatto, quindi un utente malintenzionato potrebbe precomputare molti hash anche prima di accedere al tuo sistema.

Un altro problema è che la funzione di hash utilizzata (2x SHA1) è molto veloce e un attacco a forza bruta può provare molte password in breve tempo. Con l'hardware di base sarebbe possibile provare 3.000.000 di password al secondo .

Questo metodo di hashing della password non soddisfa i moderni standard di sicurezza.

    
risposta data 22.02.2017 - 14:14
fonte
1

Dato che non viene usato nessun Salt, è normale (ed estremamente necessario !!) che la stessa funzione di hash applicata sulla stessa stringa produca sempre gli stessi risultati.

Le funzioni di hash SONO deterministiche per definizione

A proposito, impedire l'uso di Rainbow Tables è fatto grazie alla salatura, dal momento che la stringa hash è sempre diversa (dati i sali unici che dovrebbero essere)

=====

modifica: Per rispondere alla domanda reale in modo più approfondito (la parte "univoca per ogni dispositivo"): se l'hash era univoco per ogni dispositivo, eseguire una migrazione del database su un'altra macchina sarebbe impossibile poiché tutti gli hash non sarebbero più compatibili - nel caso di campi usati per le password, gli utenti non sarebbero più in grado di accedere: P Puoi certamente immaginare altri problemi simili (database distribuiti, ..)

    
risposta data 22.02.2017 - 13:33
fonte
0

I was hoping that the PASSWORD function was unique to every device

Non ci sono abbastanza algoritmi sicuri da aggirare - convenzionalmente questo viene gestito usando un unico account salt per account, ma se volessi una sicurezza più debole suppongo che potresti avere un dispositivo specifico salt.

MySQL supporta i certificati client per l'autenticazione fuori dalla scatola lungo con autenticatori del plugin e ci sono diversi available come standard (incluso il supporto per Unix PAM ).

(MariaDB ha anche le stesse API)

    
risposta data 01.03.2017 - 14:22
fonte

Leggi altre domande sui tag