L'encodage en base 64 et le hachage des mots passe sont deux outils qui peuvent protéger d'une attaque de type SQL injection.
0x01. ENCODAGE
<?php /* * Authentication checks : login base64 encoded, password hash with custom function * ------------------------------------------------------------------------------------------ */ if( isset($_POST["pwd"]) ) { mysql_connect("db_host","db_user","db_password"); if( $_GET["page"] == "inscription" ) { $res = mysql_query("INSERT INTO `db_users`.`tbl_auth` (`usr`, `pwd`) VALUES ('".base64_encode($_POST["usr"])."', '" .custom_hash($_POST["pwd"])."');"); if( $res ) { echo "Register successful."; } } if( $_GET["page"] == "connexion" ) { $sql = "SELECT * FROM `db_users`.`tbl_auth` WHERE usr LIKE '".base64_encode($_POST["usr"])."' AND pwd LIKE '" .custom_hash($_POST["pwd"])."'"; $res = mysql_query($sql); if( $res ) { $obj = mysql_fetch_object($res); if( $obj ) { echo "Connected as user: ".base64_decode($obj->usr); } } } } ?>
0x02. HASH
Si un hash MD5 ou SHA1, ou peu importe ce "casse", enfin se "bruteforce" grâce à des grosses base de données, ce même hash avec un grain de sel
est déjà plus compliqué à "cracker".
Cette fonction, ajoute "un grain de sel" de 31 caractères, ce qui complique pas mal la tâche...
...mais on va en plus, compresser ce texte (gzdeflate), l'encoder en base 64 (pour le stocker en base de donnée) et finalement, pour rendre toute tentative de retrouver le mot de passe, on va remplacer les lettres du hash (a, b, c, d, e & f) par des chiffres :
nico@secureinfo> php custom_hash.php "password" 3726486832118828331552328020078665545454
<?php /* * Sha1 hash with salt, base64 encode and compression ... * and a custom replacement * ------------------------------------------------------------------------------------------ */ function custom_hash($str,$salt1="y.fph_xAuJuvB%S,=UZFeM=8B0xg1QG") { $match = array( 0=> "a", "b", "c", "d", "e", "f" ); $replace = array( 0=> "4", "8", "2", "9", "5", "0" ); $res = base64_encode( gzdeflate($salt1.$str) ); return( str_replace( $match,$replace,sha1($res) ) ); } ?>
=> Écrit par : Nicolas, le 04 septembre 2015