In questo esempio, perché hanno cancellato un pezzo di sale generato a caso prima di cancellarlo con la password?

2

Da qui , nel codice return substr(sha1(mt_rand()),0,22); qual è il punto di prendere il valore di sha1? Viene aggiunto alla password e insieme vengono sottoposti a hash con Blowfish. Perché non aggiungere semplicemente il numero generato a caso?

class PassHash {  
    // blowfish  
    private static $algo = '$2a';  
    // cost parameter  
    private static $cost = '$10';  
    // mainly for internal use  
    public static function unique_salt() {  
        return substr(sha1(mt_rand()),0,22);  
    }  
    // this will be used to generate a hash  
    public static function hash($password) {  
        return crypt($password,  
                    self::$algo .  
                    self::$cost .  
                    '$' . self::unique_salt());  
    }  
    // this will be used to compare a password against a hash  
    public static function check_password($hash, $password) {  
        $full_salt = substr($hash, 0, 29);  
        $new_hash = crypt($password, $full_salt);  
        return ($hash == $new_hash);  
    }  
}  
    
posta Celeritas 10.01.2013 - 18:49
fonte

2 risposte

6

Fanno questo hashing con un misto di insicurezza e sciamanesimo.

L'hashing non ha valore per la sicurezza effettiva. La loro salatura è cattiva perché mt_rand() non è sufficiente per garantire l'unicità (i sali buoni dovrebbero sforzarsi di essere unici e i sali casuali sono un buon modo per ottenere valori unici con alta probabilità, ma richiede l'uso di un generatore casuale buono , in uno spazio di valore sufficientemente grande e mt_rand () fallisce in entrambi i casi). Hashing dell'output di mt_rand() con SHA-1 dà all'impressione che il sale è più casuale di quanto sia realmente; gli sviluppatori devono avere la calda sensazione confusa che le cose siano più sicure poiché "sembrano casuali" ai loro occhi umani.

Inoltre, la spruzzatura di invocazioni di funzioni hash su un dato pezzo di codice è un modo per propiziare gli Spiriti della Crittografia. È risaputo che le divinità crittografiche guardano favorevolmente coloro che le usano molto (o così molti sviluppatori credono, a quanto pare).

    
risposta data 10.01.2013 - 19:16
fonte
0

(Espanso per incorporare il feedback di CodesInChaos)

Per rispondere al "perché" che è la tua domanda, cioè nel caso generale della generazione di sale:

Un sale è solitamente visibile, non è un segreto. Semplicemente usando il valore casuale potrebbe rivelare alcune informazioni sullo stato interno del generatore di numeri casuali. Una funzione di hashing unidirezionale lo nasconde.

È un povero sostituto di un PRNG crittograficamente sicuro. Tale PRNG utilizzerà internamente uno o più hash crittograficamente protetti.

In questo caso specifico non aggiunge alcun valore a causa dell'output di bassa entropia di PHP mt_rand () (31 bit), e nel peggiore dei casi può trarre in inganno. Guarda anche link

    
risposta data 10.01.2013 - 19:01
fonte

Leggi altre domande sui tag