Applicare una trasformazione alle password prima di eseguirne l'hashing non arreca alcun danno diretto alla sicurezza fintanto che è iniettivo : due password distinte prima di applicare la trasformazione devono comunque essere distinte una volta che entrambe sono state trasformate. Il tuo "spostamento di caratteri" va bene per quello se lo fai correttamente (cioè fai attenzione a trasformare un byte di valore 255 in un byte di valore 0 che "tronca" la password).
Indirettamente , c'è un po 'di danno nel fatto che la tua trasformazione extra è un codice extra, quindi una complessità extra, e la complessità è sempre negativa per la sicurezza. Inoltre, se la trasformazione è computazionalmente costosa, allora si scontra con il numero di iterazioni usato in PBKDF2 / bcrypt (cioè hai meno CPU disponibile, quindi devi usare un conteggio iterazione inferiore).
Una trasformazione come quella che si immagina fa bene alla sicurezza solo nella misura in cui l'attaccante non ne è a conoscenza, cioè l'attaccante non ha fatto i compiti. Gli attaccanti di bassa potenza di base, che sono appena stati fortunati con un attacco di iniezione SQL, possono in realtà non avere la conoscenza, ma questi attaccanti non sono quelli spaventosi. La tua trasformazione extra non scoraggerà i potenti attaccanti, e questo è un strong attaccante di cui dovresti preoccuparti.
Le trasformazioni applicate dopo hashing non hanno alcuna influenza sulla sicurezza, tranne se stai usando qualcosa come hashing extra, nel qual caso stai solo cercando di creare una funzione hash personalizzata, che, come al solito, è una cattiva idea Quindi non farlo. Il modo corretto di utilizzare la CPU non è sprecarlo in turni di carattere voodoo e altri rituali; invece, usa la tua CPU per avere un conteggio iterazione bcrypt / PBKDF2 il più alto possibile per le prestazioni complessive dell'applicazione.