La divisione della password non è buona.
Anche la progettazione del proprio meccanismo di hashing della password non è buona. Va bene per scopi di apprendimento, ma per la produzione, questo è un no-go, perché non puoi sapere se hai fatto le cose giuste o no . È un difetto generico e onnicomprensivo della crittografia fatta in casa. Di tutta la crittografia, davvero; ma, almeno, con standard pubblici come bcrypt , beneficerai della revisione di molti occhi durante molti anni.
Dici che gli attaccanti "non conoscono il tipo di hash che hai usato". È sbagliato; lo sanno già, probabilmente meglio di te. Prima di tutto, hanno accesso a Internet, quindi possono leggere questa stessa domanda che chiedi su StackExchange. Inoltre, il metodo di hashing esiste come codice sorgente da qualche parte, e qualche script eseguibile o binario sul tuo server, quindi non può essere davvero segreto. In particolare, si desidera hash le password prima di memorizzarle perché si prevede un utente malintenzionato che potrebbe ottenere un accesso di sola lettura illegale ai dati memorizzati dal server (altrimenti non sarà necessario eseguirne l'hash) ; è molto plausibile che un tale aggressore ottenga anche un accesso di sola lettura al server code stesso, e quindi acquisisca conoscenza del metodo di hashing che si usa.
Ultimo ma non meno importante, non puoi sapere quanto il tuo algoritmo di hash è segreto. Gran parte della sicurezza riguarda la quantificazione e la misurazione. Con una password, puoi stimare entropy , a seconda del meccanismo di generazione; lo stesso per ogni chiave segreta: le chiavi vivono in uno spazio di una dimensione che può essere valutato attraverso la matematica. Ma la segretezza di un algoritmo , che esiste in vari punti, incluso il codice sorgente, i file eseguibili, eventualmente fogli stampati, i backup e il cervello di alcuni sviluppatori? Quanto segreto può essere?
Kerckhoff lo ha spiegato abbastanza chiaramente più di un secolo fa: non considererai il tuo sistema come segreto. Chiavi (e le password, che sono solo un tipo di chiave) sono progettate per concentrare la segretezza, mentre il resto dell'algoritmo deve essere considerato pubblico - perché, la maggior parte delle volte, è conoscenza pubblica.