Quello che sto per dire probabilmente mi farà sembrare un idiota ma è meglio sbagliare e imparare che avere domande senza risposta.
Da quando ho iniziato a occuparmi di password mi sono chiesto quale sia il grosso problema delle password di hashing in ogni caso, dal momento che se qualcuno si impossessa del tuo database potrebbe scoprire qualsiasi password, indipendentemente dalla tecnica di hashing utilizzata.
Quindi fondamentalmente il grande difetto delle vecchie funzioni di hashing erano le tabelle arcobaleno, qualcosa che l'algoritmo attualmente usato da PHP nella loro password hashing API, blowfish, si occupa di. Certo, è piuttosto complesso e senza dubbio è costruito da persone molto più intelligenti di me, ma comunque non ho potuto fare a meno di chiedermi se avessi costruito la mia funzione di hashing che non era vulnerabile alle tabelle arcobaleno e non ho immagazzinato il sale in posti ovvi come colonne aggiuntive nel database o utilizzare le informazioni utente come nome o email come sale, sarebbe utile?
Ho appena trascorso 5 minuti per preparare questo esempio per te, che utilizza, naturalmente, md5, come so che è il più odiato dai critici degli sviluppatori di PHP :D
function my_password_hash($password){
$salt = substr(md5(str_shuffle('0123456789abcdef')), 0, 5);
$hash = substr(md5($password . $salt), 0, -5) . $salt;
return $hash;
}
function my_password_check($password, $hash){
$salt = substr($hash, -5);
return substr(md5($password . $salt), 0, -5) . $salt === $hash;
}
$hash = my_password_hash('qwerty');
var_dump(my_password_check('qwerty', $hash)); // TRUE
var_dump(my_password_check('qwertY', $hash)); // FALSE
Produrrà diversi hash per lo stesso input ogni volta e il sale verrà mescolato nell'hash finale dell'output, se non sai esplicitamente dove si trova, non penso che possa essere trovato, ma è per questo che I Sto scrivendo qui, per scoprire se ho torto.