TL; DR: usa una funzione di derivazione della chiave appropriata invece di uno schema homegrown.
the hash can easily be extracted and brute-forced externally.
Penso che stiate sottovalutando la difficoltà di un attacco preimage su una moderna funzione di hash delle password.
Is it safe? Since I haven't seen this anywhere, I'm not sure if I overlooked something that could make this system vulnerable.
Fatto bene, ciò che proponi potrebbe non essere vulnerabile in realtà, ma probabilmente non ti comprerebbe molto. Fatto male, come discusso nelle risposte precedenti, può diventare orribilmente insicuro.
Fondamentalmente, quando pensi alle password di hashing, non pensare solo a un singolo giro della tua funzione hash crittografica media come MD5 o SHA512. Invece, la tua prima scelta dovrebbe essere quella di utilizzare una funzione di derivazione della chiave basata su password correttamente salata . Ce ne sono molti disponibili, ma le scelte più popolari attualmente sembrano essere PBKDF2 e bcrypt , con scrypt in crescita in popolarità.
A differenza delle semplici primitive di hash, le funzioni di derivazione della chiave sono specificatamente progettate per essere lente e cercano di dare a un utente malintenzionato il minimo vantaggio possibile, anche laddove l'hacker sia in grado di utilizzare hardware personalizzato per attaccare la password inserita dall'utente, anche se la password ha un'entropia relativamente bassa.
È ancora possibile memorizzare qualcosa che indica se la password è corretta. Ad esempio, LUKS esegue questa operazione memorizzando un hash crittografato salato della chiave master; se la passphrase fornita dall'utente non decodifica correttamente nessuno degli slot della chiave, la decrittografia dei dati della chiave master nello slot della chiave produrrà un risultato errato, risultante in un diverso hash della chiave principale, che viene rilevato e applicato come un risultato "passphrase errato". Si noti in questo caso che l'hash della passphrase stessa non è memorizzato. Confronta il formato su disco di LUKS , figura 1 PHDR Layout .