<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Loïc Morvan : Web 2.0 &#187; MD5</title>
	<atom:link href="http://www.loicmorvan.fr/tag/md5/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.loicmorvan.fr</link>
	<description>ma vision du Web 2.0 et du webmastering, par Loïc Morvan</description>
	<lastBuildDate>Sat, 18 Jun 2011 20:47:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>PHP : Comparaison MD5 / SHA-1</title>
		<link>http://www.loicmorvan.fr/2010/01/php-comparaison-md5-sha-1/</link>
		<comments>http://www.loicmorvan.fr/2010/01/php-comparaison-md5-sha-1/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 23:38:33 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[Optimisation]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[SHA-1]]></category>

		<guid isPermaLink="false">http://www.loicmorvan.fr/?p=1117</guid>
		<description><![CDATA[Allez, ça faisait bien longtemps que je n&#8217;avais pas pris le temps d&#8217;écrire un article orienté technique. Celui-là sera assez court mais j&#8217;espère qu&#8217;il vous conviendra car on trouve difficilement l&#8217;information sur le net. Voici donc un petit bench rapide entre deux algorithmes de hachage très souvent utilisés en PHP : MD5 et SHA1 Présentation [...]


En savoir plus : <ol><li><a href='http://www.loicmorvan.fr/2010/02/liberation-memoire-cache-linux/' rel='bookmark' title='Libération mémoire cache Linux'>Libération mémoire cache Linux</a> <small>Libérer de la mémoire cache, ca peut être utile pour...</small></li>
<li><a href='http://www.loicmorvan.fr/2009/03/design-et-support-des-navigateurs/' rel='bookmark' title='Design et support des navigateurs&#8230;'>Design et support des navigateurs&#8230;</a> <small>Actuellement, et heureusement, car c&#8217;est la concurrence qui fait progresser...</small></li>
<li><a href='http://www.loicmorvan.fr/2009/04/net-adapte-pour-les-sites-internet-personnels/' rel='bookmark' title='.Net adapté pour les sites Internet personnels ?'>.Net adapté pour les sites Internet personnels ?</a> <small>C&#8217;est la question que je me suis récemment posée et...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Allez, ça faisait bien longtemps que je n&#8217;avais pas pris le temps d&#8217;écrire un article orienté technique. Celui-là sera assez court mais j&#8217;espère qu&#8217;il vous conviendra car on trouve difficilement l&#8217;information sur le net. Voici donc un petit bench rapide entre deux algorithmes de hachage très souvent utilisés en PHP : MD5 et SHA1</p>
<p><span id="more-1117"></span></p>
<h1>Présentation algorithmes de hashage</h1>
<p>Ces deux algorithmes de hachage (il en existe d&#8217;autres) permettent de calculer l&#8217;empreinte d&#8217;une chaine de caractère de façon à en cacher son contenu.<br />
<code>MD5('loicmorvan.fr') = 53a021aa58fe4ace1d1dcaa3cd94ef59<br />
SHA1('loicmorvan.fr') = d746fa906c2e6da62ab3690cc4115d5f4dca5a50</code></p>
<p>De manière générale, ses algorithmes ne sont pas réversibles. J&#8217;en entends déjà certains d&#8217;entre vous crier au scandale ou se demander comment ils vont vérifier un mot de passe. Simple ! Vous vérifiez que les hashs correspondent : par exemple, vous vérifiez que :</p>
<p><em>md5(mot_de_passe_recu) = mot_de_passe_en_base_deja_hashe_avec_md5</em></p>
<p>Il faut tout de même savoir que tous ses algorithmes de hashage sont vulnérables. Il existe en effet de nombreuses tables de hashage pré-calculées (ou tables de correspondances) grâce auxquelles on peut retrouver la valeur initiale d&#8217;un hash pour les chaines les plus courantes. De même, plus la chaine est chiffrée sur un grand nombre de caractères hexadécimaux, moins il existe de risque de collisions (c&#8217;est à dire plusieurs chaines différentes qui auront la même valeur de hashage).<br />
<code>SHA256('loicmorvan.fr') = 13b3f824aaabf403a7562b686070492b4e54ca4c42b291d558b78aae90d2d758<br />
SHA512('loicmorvan.fr') = c94c4ed304f41c6667807beb90e5d629e9d5[...]e2d76f2d0d12b16bbbdc6e8f5660ee451f8<br />
...</code></p>
<p>Bref, tout ça nous amène à la question :</p>
<h1>Que choisir entre MD5, SHA-1 ou d&#8217;autres ?</h1>
<p>Pour ma part, j&#8217;ai opté depuis longtemps pour l&#8217;algorithme MD5, sans vraiment y faire réfléchir jusqu&#8217;à la semaine dernière où avec un collègue, on s&#8217;est posé la question : est ce que ca joue sur les performances ? J&#8217;ai cherché des réponses sans en trouver réellement sur le net et du coup, j&#8217;ai fait mon propre bench&#8230; En voici les résultats :</p>
<h2>Résultats</h2>
<p>Temps total pour 1 000 000 d&#8217;appels (moyenne sur plusieurs exécutions) :</p>
<ul>
<li>MD5 : 1.07 secondes</li>
<li>SHA-1 : 1.28 secondes</li>
</ul>
<p>Pour information, il existe également en PHP la fonction <a href="http://fr2.php.net/manual/fr/function.hash.php" target="_blank"><em>hash</em></a> faisant office de surcouche pour les fonctions <em><a href="http://fr2.php.net/manual/fr/function.md5.php" target="_blank">md5</a> </em>et <a href="http://fr2.php.net/manual/fr/function.sha1.php" target="_blank"><em>sha1</em></a>, mais permettant d&#8217;exécuter d&#8217;autres algorithmes de hashage tels que SHA-256, HAVAL160,4&#8230; Le passage par cette fonction pour le calcul des empreintes MD5 et SHA1 engendre une perte de temps de l&#8217;ordre de 30%.</p>
<h2>Code du test</h2>
<p>Voici le code qui m&#8217;a servi de test. Il a été exécuté sur un serveur dédié fonctionnant sous Linux / Gentoo, Apache2 et PHP 5.2.</p>
<p><code> $nb = 1000000;</code></p>
<p>echo &#8216;Nombre de tests à chaque fois : &#8216;.$nb;</p>
<p>$refString = &#8216;http://www.loicmorvan.fr&#8217;;</p>
<p>$string = $refString;<br />
$time=microtime(1);<br />
for ($i=0;$i&lt;$nb;$i++) $string = hash(&#8216;md5&#8242;, $string.$i);<br />
echo microtime(1)-$time,&#8217;: hash/md5&#8242;;</p>
<p>$string = $refString;<br />
$time=microtime(1);<br />
for ($i=0;$i&lt;$nb;$i++) $string = md5($string.$i);<br />
echo microtime(1)-$time,&#8217;: md5&#8242;;</p>
<p>$string = $refString;<br />
$time=microtime(1);<br />
for ($i=0;$i&lt;$nb;$i++) $string = hash(&#8216;sha1&#8242;, $string.$i);<br />
echo microtime(1)-$time,&#8217;: hash/sha1&#8242;;</p>
<p>$string = $refString;<br />
$time=microtime(1);<br />
for ($i=0;$i&lt;$nb;$i++) $string = sha1($string.$i);<br />
echo microtime(1)-$time,&#8217;: sha1&#8242;;</p>
<h1>Conclusion</h1>
<p>La différence de temps entre ces deux fonctions est tout d&#8217;environ 20% ce qui est tout de même important, même si on fait rarement un million d&#8217;appels consécutifs et le risque de collisions étant déjà extrêmement faible en MD5 (1 chance sur 3*10^38), je ne peux que vous conseiller l&#8217;emploi de la fonction <em><a href="http://fr2.php.net/manual/fr/function.md5.php" target="_blank">md5</a> </em>par rapport à la fonction <a href="http://fr2.php.net/manual/fr/function.sha1.php" target="_blank"><em>sha1</em></a>.</p>


<p>En savoir plus : <ol><li><a href='http://www.loicmorvan.fr/2010/02/liberation-memoire-cache-linux/' rel='bookmark' title='Libération mémoire cache Linux'>Libération mémoire cache Linux</a> <small>Libérer de la mémoire cache, ca peut être utile pour...</small></li>
<li><a href='http://www.loicmorvan.fr/2009/03/design-et-support-des-navigateurs/' rel='bookmark' title='Design et support des navigateurs&#8230;'>Design et support des navigateurs&#8230;</a> <small>Actuellement, et heureusement, car c&#8217;est la concurrence qui fait progresser...</small></li>
<li><a href='http://www.loicmorvan.fr/2009/04/net-adapte-pour-les-sites-internet-personnels/' rel='bookmark' title='.Net adapté pour les sites Internet personnels ?'>.Net adapté pour les sites Internet personnels ?</a> <small>C&#8217;est la question que je me suis récemment posée et...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.loicmorvan.fr/2010/01/php-comparaison-md5-sha-1/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

