Parte 1
No, questo non è sicuro, non sarebbe semanticamente sicuro (perché Random () non è sicuro)
Direi che non sarebbe sicuro perché una funzione hash riduce l'entropia del suo input. In altre parole, una funzione di hash di solito ha meno di una mappatura 1: 1 dei risultati da inserire, e ha una maggiore possibilità di scontrarsi con gli input precedenti rispetto a quanto fa l'input raw stesso.
In questo caso, l'input non casuale sarà semplicemente "più lungo" con più bit, ma non lo renderà più casuale, che è la base della maggior parte delle esigenze di crittografia. (Pensa a One Time Pad)
Una soluzione migliore:
Alimenta l'input non casuale in un "HKDF". Un HKDF consente di derivare molte chiavi da una chiave, con l'ipotesi che la chiave di origine / PRF non sia necessariamente casuale. L'HKDF usa il paradigma "Estrai poi espandi" che aggiunge casualità usando un "sale" non segreto che è casuale. Esempio HMAC(salt, yourKey)
Un altro approccio è quello di alimentare quell'input non casuale in un codice di flusso come AES o 3DES e usarlo come una volta sola (o qualsiasi altra cosa tu voglia usare per)
Come lo attaccheresti?
Devo sapere come viene usato. L'attacco è lo stesso dell'attacco a caso () con il ritardo di hashing aggiunto in seguito. La versione semplificata di questo attacco è sapere che l'area che hai bisogno di forza bruta è molto più piccola di 2 ^ 51 e che è probabilmente non trascurabile.
In un esempio di codice di flusso, significa che SHA1 causerà una collisione in meno di 281,5 terabyte è crittografato e la funzione rand () lo riduce ulteriormente. (se qualcuno sa come calcolare questo apprezzerei le informazioni)
Parte 2
Concentrati solo sull'aspetto "hashing" che non ha la relazione con un PRNG come sospetti:
Le collisioni sono cattive perché permettono all'attaccante di fare molte cose, come implementare un messaggio scelto, una falsificazione esistenziale o una serie di altri attacchi, a seconda di dove usi l'output dell'hash risultante.
In termini di hashing, è più probabile che si verifichi una collisione nelle operazioni 2 ^ n / 2 (all'incirca la radice quadrata della dimensione dello spazio di output).
Name Size Attack Operations
SHA-1 160 2^80 (Insecure, don't use)
SHA-256 256 2^128
SHA-512 512 2^256
Whirlpool 512 2^256 (AES based and slowest)
Quanto sopra elencato è la migliore resistenza di collisione possibile (in teoria) basata esclusivamente sul numero di bit nell'output.
Tieni presente che la sicurezza realistica di un hash sarà probabilmente meno sicura del massimo teorico. Prendiamo ad esempio SHA-1, il collision finder più conosciuto richiede solo 2 ^ 51 valutazioni hash e il caso teorico migliore è 2 ^ 80)