don’t crypt password with mysql functions

Au début ça me paraissait une bonne idée, de déléguer le cryptage des mots de passe à mysql. Mais, non. Et c’est normal. Quoique.

Le cryptage doit bien sûr être asymétrique, genre md5 ou sha1, pour ne pas stocker de passe qui soit décryptable, juste stocker un hash qui valide un mot de passe. (select * from user where md5(“‘.$_POST[“pw”].'”)=passmd5) (oui, un petit coup d’électricité de rappel d’injection sql)

par contre la fonction password c’est juste une combinaison de deux sha1 (!!!)

https://unix.stackexchange.com/questions/44883/encrypt-a-password-the-same-way-mysql-does

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'
 
perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'
 
php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'

 

Et donc 1 : ya pas de salt

mais bon, les gens ont la curieuse idée de stocker le salt avec le code, $X$salt$code$ = utilise le protocole X avec le salt en paramètre. Un peu comme de noter l’adresse et le digicode sur son porte clé. ou le code de CB. bref..

L’autre truc c’est que c’est pas random. password(‘toto’) donnera toujours la même chose. Et ce serait mieux qu’il donne à chaque fois des valeurs différentes. Le seul moyen de tester serait de le passer à la fonction de vérification pass_verif(pass saisi, contenu de la base).

C’est fourni par le vieux code crypt(), ou le nouveau http://php.net/manual/fr/function.password-verify.php , ou le code alternatif https://github.com/ircmaxell/password_compat/blob/master/lib/password.php , or shorter https://gist.github.com/odan/1d4ff4c4088e906a5a49

 

function create_password_hash($strPassword, $numAlgo = 1, $arrOptions = array())
{
if (function_exists('password_hash')) return(password_hash($strPassword, $numAlgo, $arrOptions));
$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$salt = str_replace('+', '.', base64_encode($salt));
return(crypt($strPassword, '$2y$10$' . $salt . '$'));
}
function verify_password_hash($strPassword, $strHash)
{
if (function_exists('password_verify')) return(password_verify($strPassword, $strHash));
$strHash2 = crypt($strPassword, $strHash);
return( $strHash == $strHash2);
}
//TEST: $strHash = create_password_hash("secret", PASSWORD_DEFAULT);echo $strHash . "\n";
//echo (verify_password_hash('secret', $strHash)) ? 'Password is valid!':'Invalid password.';

Un jour il pourrait y avoir un portage de crypt() dans mysql .
Mais il n’y est pas, exprès, pour éviter de trop transporter un mot de passe non crypté, ce qui multiplierait les risques de sniff (snif!).

(merci Laurent)

Pocket

Scripter comme un dinosaure

[original : http://guykastenbaum.blogspot.ch/2012/01/scripter-comme-un-dinosaure.html 27 janvier 2012]
comme j’aime bien cet article, je l’ai retrouvé sur blogger et réinjecté dans mon blog actuel.
Comment scripter (sh ou ksh) sur des environnements compatibles linux AIX Solaris ?
Je sais qu’il suffirait de changer de versions de sh ksh bash etc mais
Quelques recettes de cuisine :pour le if
if [ “x${var}” = “xyes” ]; then echo “yes”; fiRESPECTER les espaces, non il ne faut rien coller, ni [“, ni “=”, ah c’est dur…

ajouter le “x” pour éviter les if “-u” …=>; erreur sur l’opération -u

ajouter les guillemets car dans if [ $var =  $var pourrait être vide
(ça fait doublon avec “x” mais on est jamais assez prudent)

de temps en temps ajouter les accolades pour $var , soit ${var}, par pure paranoia

ajout récent : dans les tests d’égalité, il faut utiliser ‘=’ et non ‘ = = ‘(==), c’est pas compatible avec le vieux ‘sh’;

utiliser -eq plutôt que == , quoique on peut quand même oser. (en général, j’ose, c’est plus lisible)

je n’utilise pas le raccourci $a == “y” || $b=”n” , j’ai trop peur que ça soit trop moderne.

avec prudence les OR et AND sous forme de -o et -a ;

les jours de grande parano, utiliser des doubles crochets comme dans la doc
if [[ “x$a” != “xy” -a “x$a” != “xn” ]];then echo “maybe”; fi

pour faire un $x=~/toto/ [perl] ben d’à peu près lisible j’ai

if [ ” `echo $x|sed -e 's/toto//'`" != "$x" ];then ...

pour le sed 
en général il est sympa, sauf chez solaris

sur solaris sed -e ‘s/\t/ /g’ remplace les ‘t’ par des blancs.(oui,oui)
il faut remplacer sed -e “s/\t/ /g” par tr ‘\t’ ‘ ‘
c’est ce qui m’a décidé à écrire ce billet
d’ailleurs, tr marche assez bien : tr [:upper:] [:lower:] est bien compris
cadeau pour générer un mot de passe de 6 caractères :

$(head -n 100 /dev/urandom| tr -dc “[A-Z][a-z][0-9]”|cut -c1-6)

de même, si tu as des fichiers qui ne se termine pas par “\n” , le sed te zappe la dernière ligne. (oui,oui)
faire une boucle de réparation avant :

for instfile in $(find . -type f);do
if [ “$(tail -1 $instfile|od -t x1|tail -2|head -n 1|grep -c ‘ 0a’)” == “0” ];then
echo “” >> $instfile
fi
done

ah oui, oubliez le pratique -i, il faut revenir à sed -e ‘….’ a>b;mv b a
ou mieux car il conserve les attributs cp -p a b;sed -e ‘..’ b>a;rm -f b

[ajout de mai 2012]
Encore Solaris qui nous rappelle que sed -e “s/a/b/ s/c/d/” est un raccourci trop récent pour être supporté. Pour être 19k-compatible il faut écrire : sed -e “s/a/b/” -e “s/c/d/”

[ajout avril 2013]
Ah AIX se fait remarquer, on ne peut pas faire sed fichier -e ‘…’
car ça n’est pas dans le bon ordre. Soit sed -e ‘…’ fichier soit (c’est plus sûr)
cat fichier|sed -e ‘…’
ed
quelquefois on s’en sort en allant chez cet épicier discount, exemple
ed -s src/xmlrpc_introspection.h << EOD
/XMLRPC_ServerSetValidationLevel
i
XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle);
void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method);
.
w
q
EOD
 
 
shell (sh echo $* .)

ne pas utiliser le trop moderne ‘-n’ option d’echo, car
echo “echo -n toto” > /tmp/a ; sh /tmp/a ; ksh /tmp/a ; rm a
affiche bien “-n toto”

éviter les echo avec des passages à la ligne , même avec \

sh ne connait pas $(commande), il ne connait que `commande` , c’est pas pratique.

sh n’accepte pas export PIF=”paf” , il exige PIF=”paf” ; export PIF
de toutes façon j’utilise ksh (c’est les ordres de là haut)

$0 $1 $* $@
variables fragiles, elles peuvent s’effacer le long du script (suffit qu’elles soient utilisées en sous entendu dans un sous appel), donc les sauver dès le début du script

$0 des fois contient “-bash” au lieu de “bash” je sais pas d’où ça sort.

“source file” : utiliser “. ./file” ; c’est moins lisible mais plus archaique

cadeau, un complément de getopts

while getopts “n:t:m:a:u:s:h” opt; do
if [ “$OPTARG” = “” ]; then OPTARG=1; fi
if [ “$opt” != ‘?’ ] && [ “$opt” != ‘:’ ]; then
export OPTARG_${opt}=$OPTARG
fi
done

les fonctions s’écrivent

compilesys()
{
pas de ‘function’
des parenthèses vides (on chopera $1 $2 …)
accolade à la ligne
et ça s’appelle sans les parenthèses, compilesys unzip

pour id, uname
pour les fonctions borderline, qu’on croit qu’elles sont standards, eh ben moitié moitié.
faut vérifier les options de base. sur solaris j’utilise

if [ -f “/usr/xpg4/bin/id” ];then export GSCRIPT_BIN_ID=/usr/xpg4/bin/id;
else export GSCRIPT_BIN_ID=id; fi

sinon je ne m’en sors pas (besoin du id -gn -u -g ..)

uname -s est plus fiable que hostname (JYP)

grep

ne connait pas toujours -E (solaris) , par contre son équivalent egrep existe …

tar
oubliez le -z pour de copain gzip, retrouvez tar cf -|gzip -c|gzip -dc|tar xf –
pour les gros tar, ou avec des longs paths, utiliser gtar ou une version fraiche :

pour tar gzip zip bzip make … : RECOMPILEZ ! cadeau :

compilesys()
{
confplus=$2
gzip -dc ../zip/$i-*.gz 2> /dev/null | tar xf – #ou variante…
cd $i-*/ ;   ./configure –cache-file=config.cache –prefix=SOMEWHERE $confplus
make ;  make install ;  cd ..
}
compilesys tar “FORCE_UNSAFE_CONFIGURE=1”
for soft in xz bison flex m4 autoconf automake libtool make bash binutils;do compilesys $soft;done

J’en ai sûrement oublié, dites moi

Pocket