Altri hanno affrontato il fatto che stai violando il Principio di Kerckhoffs. Vorrei suggerire un modo per riformulare la proposta che non lo fa.
Rendi la tua funzione parte della chiave
Se trattiamo la tua "funzione che conosci solo tu" come parte della "chiave", allora non è una violazione del Principio di Kerckhoffs. Cioè, prendiamo la tua "chiave" per avere due parti. La passphrase di input, p e la funzione segreta, f .
La tua funzione è deducibile dal suo output?
Hai intenzione di memorizzare sia p che f ? Probabilmente. Utilizzerai un p e f univoco per ciascun servizio che utilizzi? Probabilmente no.
Cioè, mi aspetto che tu sia tentato di cambiare solo p per diversi casi mentre riusciamo lo stesso f . Questo può essere reso sicuro, ma ciò che descrivi con il tuo esempio non lo è. Questo perché se un utente malintenzionato riceve una coppia di password derivate, ad esempio f ("correcthorse") ed f ("batterystaple"), sarà in grado di capire che cosa è f .
Correggi rendendo la tua funzione una funzione pseudo-casuale
Quindi, se vuoi farlo, avrai bisogno di un f che non sia deducibile dall'hacker che ha n della tua password derivata, f ( p1 ) ... f ( pn ). Ci sono funzioni crittografiche che faranno questo per te. HMAC è ciò che viene subito in mente.
Lascia che f (p) = HMAC ("qualche costante segreto solo tu sai", p)
In questo modo, un utente malintenzionato che diventava vecchio di f (p) avrebbe avuto difficoltà a cercare di scoprire il segreto costante, in particolare se non conosceva p .
Problemi di codifica
Si noti che l'output di f (p) non sarà testo ASCII. Quindi dovresti trasformarlo in qualcosa di usabile come password dove ti serve. È difficile farlo in generale. Ad esempio, se hai usato la codifica base64, dovresti assicurarti che il posto in cui stai utilizzando la password generata accetti tutti i simboli che possono apparire in base64. Allo stesso modo, se utilizzi una rappresentazione esadecimale, potresti non ottenere tutti i "simboli" che alcuni servizi potrebbero richiedere per una password.
Sono questi problemi di codifica il motivo per cui questo sistema non funzionerà come schema generale. Può essere usato e quindi manualmente aggiustato caso per caso, ma ciò significa che puoi usarlo solo per un paio di casi.