<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Petetin</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Petetin"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Petetin"/>
	<updated>2026-04-16T14:27:36Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11291</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11291"/>
		<updated>2018-11-25T20:41:49Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque avec une table arc-en-ciel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
Cette attaque repose sur un compromis temps/mémoire. Le principe est de calculer un tableau de taille M x N d&#039;indices qui correspondent à différents hachés. Au lieu de stocker toutes les correspondances clair --&amp;gt; hash, on stocke généralement que le premier et le dernier élément de la chaine. Plus M et N sont grands, plus on va couvrir l&#039;ensemble des clairs. &lt;br /&gt;
&lt;br /&gt;
Premièrement, on génère un nombre aussi aléatoire que possible, puis on passe d&#039;indice en indices N fois. On répète ce processus M fois.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 &amp;lt;?php &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général, l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peut par exemple essayer de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différents et il devra utiliser le même coût pour hacher des chaînes de caractères ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11285</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11285"/>
		<updated>2018-11-25T20:36:34Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque avec une table arc-en-ciel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
Cette attaque repose sur un compromis temps/mémoire. Le principe est de calculer un tableau de taille M x N d&#039;indices qui correspondent à différents hachés. Premièrement on génère un nombre aussi aléatoire que possible, puis on passe d&#039;indice en indices N fois.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 &amp;lt;?php &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général, l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peut par exemple essayer de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différents et il devra utiliser le même coût pour hacher des chaînes de caractères ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11284</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11284"/>
		<updated>2018-11-25T20:35:33Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque avec une table arc-en-ciel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
Cette attaque repose sur un compromis temps/mémoire. Le principe est de calculer un tableau de taille M x N d&#039;indices qui correspondent à différents hachés.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 &amp;lt;?php &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général, l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peut par exemple essayer de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différents et il devra utiliser le même coût pour hacher des chaînes de caractères ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11281</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11281"/>
		<updated>2018-11-25T20:29:33Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Que se passe-t-il si la base de données est piratée ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 &amp;lt;?php &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général, l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peut par exemple essayer de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différents et il devra utiliser le même coût pour hacher des chaînes de caractères ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11278</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11278"/>
		<updated>2018-11-25T20:27:51Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Utiliser bcrypt avec PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 &amp;lt;?php &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11277</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11277"/>
		<updated>2018-11-25T20:26:56Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Utiliser bcrypt avec PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11276</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11276"/>
		<updated>2018-11-25T20:26:01Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Les particularités de Bcrypt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Telle est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot;. Il doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11262</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11262"/>
		<updated>2018-11-25T20:14:09Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 2. Chiffrement avec une partie des sous-clés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Chaque S-Box accepte un mot de 8 bits en entrée et produit une sortie de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11257</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11257"/>
		<updated>2018-11-25T20:07:06Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 2. Chiffrement avec une partie des sous-clés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Notre état a la même structure que l&#039;état généré par Blowfish. Il contient un tableau P de 18 cases. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Le schéma ci-dessous montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. &lt;br /&gt;
&lt;br /&gt;
Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11253</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11253"/>
		<updated>2018-11-25T19:55:15Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 2. Chiffrement avec une partie des sous-clés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt state with the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc. Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
Ce schéma montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11246</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11246"/>
		<updated>2018-11-25T19:45:32Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 1. Génération des sous-clés avec la fonction eksblowfish (pour Expensive Key Schedule Blowfish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. Cet algorithme fait partie des algorithmes de &amp;quot;préparation de clés&amp;quot;. Le principe est de partir d&#039;une graine, puis construire petit à petit la clé finale à partir de sous-clés.&lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;). Il s&#039;agit du logarithme binaire du nombre d&#039;itérations de l&#039;algorithme.&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc.&lt;br /&gt;
&lt;br /&gt;
Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
Ce schéma montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11245</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11245"/>
		<updated>2018-11-25T19:41:57Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque brute force */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
Des variantes de cet algorithme existent, tel que chercher aléatoirement un clair dans la liste plutôt que de parcourir toutes la liste.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc.&lt;br /&gt;
&lt;br /&gt;
Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
Ce schéma montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11244</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11244"/>
		<updated>2018-11-25T19:38:13Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Que se passe-t-il si la base de données est piraté ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc.&lt;br /&gt;
&lt;br /&gt;
Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
Ce schéma montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piratée ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11243</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=11243"/>
		<updated>2018-11-25T19:37:34Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années. En 2017, une faille a été trouvée sur le protocole le plus répandu pour la sécurité des mots de passe wifi, à savoir le WPA 2. En octobre 2018, le réseau social Facebook s&#039;est fait piraté 5 millions de comptes en Europe. Aujourd&#039;hui, tous les sites possèdent un système d&#039;authentification. Les utilisateurs doivent se connecter avec un mot de passe, plus ou moins complexe en fonction des règles imposées sur le site. La robustesse d&#039;un mot de passe face aux différentes attaques joue un rôle essentielle dans la sécurisation de nos données. Un mot de passe est qualifié de &amp;quot;faible&amp;quot; s&#039;il est facilement attaquable. Il existe plein d&#039;algorithme pour chiffrer les mots de passe (MD5, SHA1, ...). &lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
[[Fichier:Hashing-function schema.png]]&lt;br /&gt;
* Les fonction de hachage sont des fonctions à sens unique ( on ne peut pas à partie d&#039;une empreinte retrouver le chaîne de caractère initial )&lt;br /&gt;
* La fonction est le plus injective possible ( à partir d&#039;une image on a au plus un seul antécédent ) &lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Repeatedly encrypt the text &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 times&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 bytes ==&amp;gt; three 64-bit blocks&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
Fonction EncryptECB : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:EncryptECB.png]]&lt;br /&gt;
&lt;br /&gt;
Blowfish est basé sur un schéma de Feistel avec 16 tours.&lt;br /&gt;
Un réseau de Feistel est subdivisé en plusieurs tours ou étages. Dans sa version équilibrée, le réseau traite les données en deux parties de taille identique. À chaque tour, les deux blocs sont échangés puis un des blocs est combiné avec une version transformée de l&#039;autre bloc.&lt;br /&gt;
&lt;br /&gt;
Chaque ligne représente 32 bits (une case du tableau P). L&#039;algorithme gère deux ensembles de clés : les 18 entrées du tableau P et les quatre S-Boxes de 256 éléments chacune. Les S-Boxes acceptent un mot de 8 bits en entrée et produisent une sortie de 32 bits. Une entrée du tableau P est utilisée à chaque tour. Arrivé au tour final, la moitié du bloc de donnée subit un XOR avec un des deux éléments restants dans le tableau P. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:F-fonction blowfish.png ‎ ]]&lt;br /&gt;
&lt;br /&gt;
Ce schéma montre la F-fonction de Blowfish. Elle sépare une entrée de 32 bits (une case du tableau P) en quatre morceaux de 8 bits et les utilise comme entrées pour accéder aux S-Boxes. Les sorties sont additionnées avec une somme modulo 232 et l&#039;algorithme effectue un XOR entre les deux sous-totaux pour produire la sortie finale de 32 bits.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blowfish structure.png]]&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir d&#039;avoir un mot de passe pas trop long afin de pouvoir facilement le retenir. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Bcrypt en pratique == &lt;br /&gt;
&lt;br /&gt;
=== Temps de chiffrement par rapport au coût ===&lt;br /&gt;
&lt;br /&gt;
Voici un graphique représentant le temps de chiffrement de Bcrypt en fonction du coût passé en paramètre avec une implémentation en Node.js avec un MacBook Pro : &lt;br /&gt;
&lt;br /&gt;
* Processor: 2.8 GHz Intel Core i7&lt;br /&gt;
* Memory: 16 GB 2133 MHz LPDDR3&lt;br /&gt;
* Graphics: Radeon Pro 555 2048 MB, Intel HD Graphics 630 1536 MB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Hasing_time_compared_to_cost.png]]&lt;br /&gt;
&lt;br /&gt;
Voici les valeurs utilisés pour générer le graphique : &lt;br /&gt;
&lt;br /&gt;
 bcrypt | cost: 10, time to hash: 65.683ms&lt;br /&gt;
 bcrypt | cost: 11, time to hash: 129.227ms&lt;br /&gt;
 bcrypt | cost: 12, time to hash: 254.624ms&lt;br /&gt;
 bcrypt | cost: 13, time to hash: 511.969ms&lt;br /&gt;
 bcrypt | cost: 14, time to hash: 1015.073ms&lt;br /&gt;
 bcrypt | cost: 15, time to hash: 2043.034ms&lt;br /&gt;
 bcrypt | cost: 16, time to hash: 4088.721ms&lt;br /&gt;
 bcrypt | cost: 17, time to hash: 8162.788ms&lt;br /&gt;
 bcrypt | cost: 18, time to hash: 16315.459ms&lt;br /&gt;
 bcrypt | cost: 19, time to hash: 32682.622ms&lt;br /&gt;
 bcrypt | cost: 20, time to hash: 66779.182ms&lt;br /&gt;
&lt;br /&gt;
=== Utiliser bcrypt avec PHP === &lt;br /&gt;
&lt;br /&gt;
La fonction PHP : &lt;br /&gt;
  string password_hash ( string $password , int $algo [, array $options ] )&lt;br /&gt;
&lt;br /&gt;
Utilise par défaut l&#039;algorithme Bcrypt pour hacher les mots de passes. &lt;br /&gt;
&lt;br /&gt;
Le coût par défaut définit dans password_hash est de 10.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez spécifier dans les options le coût comme ceci : &lt;br /&gt;
&lt;br /&gt;
 $options = [&lt;br /&gt;
     &#039;cost&#039; =&amp;gt; 12,&lt;br /&gt;
 ];&lt;br /&gt;
 echo password_hash(&amp;quot;rasmuslerdorf&amp;quot;, PASSWORD_BCRYPT, $options);&lt;br /&gt;
&lt;br /&gt;
L&#039;idéal est de mettre un coût suffisamment pour que le serveur qui hébergera votre application PHP mette au moins 50 ms pour hacher un mot de passe avec bcrypt&lt;br /&gt;
Pour ce faire vous pouvez ce petit bout de code qui vous permet de trouver le coût adéquat : &lt;br /&gt;
 $timeTarget = 0.05; // 50 millisecondes&lt;br /&gt;
 $cost = 8;&lt;br /&gt;
 do {&lt;br /&gt;
     $cost++;&lt;br /&gt;
     $start = microtime(true);&lt;br /&gt;
     password_hash(&amp;quot;test&amp;quot;, PASSWORD_BCRYPT, [&amp;quot;cost&amp;quot; =&amp;gt; $cost]);&lt;br /&gt;
     $end = microtime(true);&lt;br /&gt;
 } while (($end - $start) &amp;lt; $timeTarget); &lt;br /&gt;
 echo &amp;quot;Valeur de &#039;cost&#039; la plus appropriée : &amp;quot; . $cost;&lt;br /&gt;
&lt;br /&gt;
=== Que se passe-t-il si la base de données est piraté ? ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Bcrypt hash.png|200px|thumb|middle|Les différentes parties de l&#039;empreinte bcrypt]]&lt;br /&gt;
&lt;br /&gt;
En général l&#039;empreinte bcrypt est stocké dans une seule colonne en base de données.&lt;br /&gt;
&lt;br /&gt;
Si un pirate récupère l&#039;ensemble des hash bcrypt, il peu par exemple essayé de faire une attaque avec des tables arc-en-ciel mais il devrait générer autant de table arc-en-ciel qu&#039;il y a de sel différent et il devra utiliser le même coût pour hacher des chaînes de caractère ce qui sera très long pour générer ce genre de table.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
http://www.lefigaro.fr/secteur/high-tech/2018/10/02/32001-20181002ARTFIG00121-piratage-de-facebook-5-millions-de-comptes-concernes-en-europe.php&lt;br /&gt;
&lt;br /&gt;
https://www.zdnet.fr/actualites/faille-majeure-dans-wpa2-wi-fi-que-faire-qui-est-concerne-maj-39858724.htm&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10573</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10573"/>
		<updated>2018-11-12T02:04:33Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;plainText&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;plainText&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Key_schedule&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10572</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10572"/>
		<updated>2018-11-12T00:05:01Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;plainText&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;plainText&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/S-Box&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10571</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10571"/>
		<updated>2018-11-11T23:28:58Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 2. Chiffrement avec une partie des sous-clés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;plainText&#039;&#039;, &#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte clair 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;plainText&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;plainText&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt utilise l&#039;algorithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;plainText&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;plainText&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré l&#039;état des sous-clés, on prend la chaîne de caractères plainText qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec l&#039;état de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10570</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10570"/>
		<updated>2018-11-11T23:10:43Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 1. Génération des sous-clés avec la fonction eksblowfish (pour Expensive Key Schedule Blowfish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
&lt;br /&gt;
Comme nous l&#039;avons dit précédemment, Bcrypt s&#039;appuie sur l&#039;algorithme Blowfish.&lt;br /&gt;
La première étape de l&#039;algorithme Bcrypt consiste à générer la clé qui va permettre le chiffrement du texte clair. &lt;br /&gt;
&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 octets ==&amp;gt; trois bloc de 64 bit&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt qui utilise l&#039;agolrithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;ctext&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré le state des sous-clés, on prend la chaîne de caractère magique &#039;&#039;&#039;OrpheanBeholderScryDoubt&#039;&#039;&#039; sur 192 bits qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec le state de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10569</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10569"/>
		<updated>2018-11-11T23:01:14Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* 1. Génération des sous-clés avec la fonction eksblowfish (pour Expensive Key Schedule Blowfish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractères sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 octets ==&amp;gt; trois bloc de 64 bit&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt qui utilise l&#039;agolrithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;ctext&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré le state des sous-clés, on prend la chaîne de caractère magique &#039;&#039;&#039;OrpheanBeholderScryDoubt&#039;&#039;&#039; sur 192 bits qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec le state de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10568</id>
		<title>INFO002 : Cryptologie</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10568"/>
		<updated>2018-11-11T13:48:34Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
# Cours &lt;br /&gt;
#* Support de cours (presentation [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/cours.pdf PDF], article [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/article.pdf PDF])&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TDs 1 : cryptographie élémentaire [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/TDs/td-1.ps PDF]&lt;br /&gt;
# TPs et autres travaux pratiques [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Tests/doc/html/index.html Pages des TPs]&lt;br /&gt;
# Autres ressources&lt;br /&gt;
#* Handbook of Applied Cryptology [http://www.cacr.math.uwaterloo.ca/hac/]&lt;br /&gt;
#* Cryptologie en ligne [http://www.apprendre-en-ligne.net/crypto/menu/index.html]&lt;br /&gt;
# [[Projets étudiants cryptographie et sécurité]]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2018/2019 ==&lt;br /&gt;
&lt;br /&gt;
Créez les liens vers vos wikis ci-dessous (comme les autres).&lt;br /&gt;
&lt;br /&gt;
# Authentification à deux facteurs { R. VIOLETTE, C. THONONT } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Authentification_deux_facteurs Authentification à deux facteurs]&lt;br /&gt;
# Sécuriser les mots de passe avec Bcrypt { A. PETETIN, F. SEBIRE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Bcrypt Bcrypt]&lt;br /&gt;
# Les réseaux euclidiens {A. BROGNA, A. BRUHL} -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Les_r%C3%A9seaux_euclidiens Les réseaux euclidiens]&lt;br /&gt;
# Game Trainer {L. AUGER} -- []&lt;br /&gt;
# Cryptologie pour le Cloud { S. DEMARS, X. GOLEMI } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptologie_pour_le_Cloud Cryptologie pour le Cloud]&lt;br /&gt;
# Faille CSRF et CRLF { V. BASSET, V.PEILLEX } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Faille_CSRF_et_CRLF Faille CSRF et CRLF]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2017/2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Stéganographie { S. BARNIAUDY, S. DUPRAZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Steganographie stéganographie]&lt;br /&gt;
# Pretty Good Privacy { M. PELLET, B. LE SAUX } [https://lama.univ-savoie.fr/mediawiki/index.php?title=Pretty_Good_Privacy Pretty Good Privacy]&lt;br /&gt;
# Cryptographie Visuelle { T. COUPECHOUX, N. TASCA} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=CryptographieVisuelle Cryptographie Visuelle]&lt;br /&gt;
# Prise de contrôle à distance de la machine Windows 7 par une faille sur acrobat reader 9, preuve par l&#039;exemple de l&#039;intérêt des mises à jours { A. CHIVOT, P. PASQUIER, T. NOWICKI} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=HackWind7FailleAcrobR7 Attaque Windows 7 par une faille sur acrobat reader 9 via Metasploit]&lt;br /&gt;
# Authentification via fingerprint { Z. CIMINERA, A. HURSTEL, F. VOUILLAMOZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Autentification_via_fingerprint Autentification via fingerprint]&lt;br /&gt;
# Ransomwares { L. FERREIRA-GOMEZ, S. BERCHERY } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Ransomware Ransomwares]&lt;br /&gt;
# Cryptomonnaie { A. PORCHERON-ROCHE, L. JOMMETTI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Cryptomonnaie Crypto-monnaie]&lt;br /&gt;
# Sécurité des réseaux sans fils WEP, WPA { M. LEBLANC, M.-O. DIALLO } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Securite_des_reseaux_WEP_WPA Sécurité des Réseaux WEP &amp;amp;amp; WPA]&lt;br /&gt;
# le chiffre ADFGVX { M. OUALI-ALAMI, O. SOUISSI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Le_chiffre_ADFGVX le chiffre ADFGVX]&lt;br /&gt;
# La sécurité de la couche physique du RFID { J. MANGANONI, F. PRISCOGLIO } --[https://lama.univ-savoie.fr/mediawiki/index.php/Attaque_des_supports_sans_contact_type_RFID_et_NFC Sécurité du RFID]&lt;br /&gt;
# Blockchains { A. BADAJ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Blochchain Blockchains]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2016/2017 ==&lt;br /&gt;
&lt;br /&gt;
# Carré de Polybe { C. Farnier, B. Lauret } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Carre_de_Polybe Carré de Polybe]&lt;br /&gt;
# Cryptographie sur courbe elliptique (ECC) et l&#039;échange de clés Diffie-Hellman sur une courbe elliptique (ECDH) { P. Clavier }&lt;br /&gt;
# Sécurité des réseaux mobiles { G. Charvier, G. Yoccoz } -- [https://lama.univ-savoie.fr/mediawiki/index.php/GSM_Security La sécurité du réseau GSM]&lt;br /&gt;
# Sécurité des fichiers de format commun { A. De-Laere, T. Martin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/S%C3%A9curit%C3%A9_des_fichiers_de_format_commun Sécurité des fichiers de format commun]&lt;br /&gt;
# Sécurité des appareils mobiles { B. Vaudey, B. Toneghin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Sécurité_appareil_mobile Sécurité des appareils mobiles]&lt;br /&gt;
# Vulnérabilité des réseaux lorawan { H. A. RAKOTOARIVONY, N. Y. P. RANDRIANJATOVO } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Vulnerabilite_du_reseaux_lorawan Vulnerabilite des reseaux lorawan]&lt;br /&gt;
# Injections SQL (SQLi) et méthodes de protection { R. Rebillard, L. Robergeon } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Injections_SQL_et_m%C3%A9thodes_de_protection WikiSQLi]&lt;br /&gt;
# Social engineering { A. Senger, J. Manceaux } [https://lama.univ-savoie.fr/mediawiki/index.php/Social_engineering Social engineering]&lt;br /&gt;
# Courbes elliptiques pour la sécurité informatique {J. Suzan, G. Zablocki }&lt;br /&gt;
# Application &amp;quot;textsecure&amp;quot; { F. Ribard, A. Abdelmoumni } -- [https://lama.univ-savoie.fr/mediawiki/index.php/TextSecure WikiTextSecure]&lt;br /&gt;
# Cryptographie Visuelle { N. Baudon, G. Gomila, A. Vincent } -- [http://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptographie_Visuelle Cryptographie visuelle]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2014/2015 ==&lt;br /&gt;
&lt;br /&gt;
# Cryptologie VS NSA { H. Ramamonjy, N.E. Ould Kadi }&lt;br /&gt;
# le Bitcoin { H. Helbawi, A. Tang, J. }&lt;br /&gt;
# le virus &amp;quot;stuxnet&amp;quot; { N. Challut et T. Chisci }&lt;br /&gt;
# Google Recaptcha { A. SAYAH, A. EL-HARRAS }&lt;br /&gt;
# La cryptographie dans l&#039;antiquité { Y. Lombardi, G. Badin }&lt;br /&gt;
# La sécurité des cartes bancaires { M. Salvat, Y. Salti }&lt;br /&gt;
# Cryptolocker { W. Lecable, M. Genovese }&lt;br /&gt;
# La machine de Turing et ses variantes { C. Laignel, P.E. Roux }&lt;br /&gt;
# La machine ENIGMA { B. Da Silva, G. Ply }&lt;br /&gt;
# La stéganographie { K. Deléglise, Y. Rakotonanahary }&lt;br /&gt;
# Sécurité des cartes bancaires { A. Bigane, F. Way }&lt;br /&gt;
# Le craquage de la cryptographie quantique ? { D. Cauwet, A. Hauguel }&lt;br /&gt;
# Le paiement par NFC { J. Maurice, S. Zehnder }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2013/2014 ==&lt;br /&gt;
&lt;br /&gt;
#* Le cryptosystème Bitcoin { Johanny Clerc-Renaud &amp;amp; Clément Montigny }&lt;br /&gt;
#* La stéganographie { Bosviel Thomas &amp;amp; Tolron Sebastien}&lt;br /&gt;
#* AES { Avet Anthony &amp;amp; Duraz Aurélien }&lt;br /&gt;
#* Payement NFC { Montouchet Raphaël &amp;amp; Marois Jeremy }&lt;br /&gt;
#* La sécurité dans les box de FAI { Charron Thomas &amp;amp; Mesurolle Anthony }&lt;br /&gt;
#* La technologie RFID et la sécurité { CHANTREL Thierry &amp;amp; SEZILLE Aurélien }&lt;br /&gt;
#* Le Cloud et la Cryptologie { Capellaro Alexandre &amp;amp; Chabert Cédric }&lt;br /&gt;
#* La sécurité et les chaines TV cryptées { CINDOLO Giuseppe &amp;amp; NARETTO Benjamin }&lt;br /&gt;
#* Tunneling TCP/IP via SSH {RAHARISON Laurent &amp;amp; JEAN FRANÇOIS Michael}&lt;br /&gt;
#* Principes et techniques de génération de nombres aléatoires {BERTHON Yohann &amp;amp; KELFANI Hugo &amp;amp; REY Anthony}&lt;br /&gt;
#* Sécurité atypique et empreintes des navigateurs {FONTANA Antonin}&lt;br /&gt;
#* La sécurité des monnaies électroniques {BUISSON Valentin &amp;amp; GENY-DUMONT Rémi}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2012/2013 ==&lt;br /&gt;
&lt;br /&gt;
#* Nouvelle philosophie de partage de fichiers avec MEGA { WAYNTAL David et DOMINATI Nicolas } (ok)&lt;br /&gt;
#* La cyberguerre { COLIN François et APPREDERISSE Benjamin } (ok)&lt;br /&gt;
#* Octobre Rouge { REGAZZONI Rudy et LOMBARD Adrien } (ok)&lt;br /&gt;
#* HTTPS et SSL { ASSIER Aymeric et ROLLINGER Claire } (ok)&lt;br /&gt;
#* DMZ { COLLOMB Camille et LAURENT Corantin } (ok)&lt;br /&gt;
#* Failles de sécurité des systèmes informatiques de grandes entreprises (LinkedIn, Apple, Sony, ...) { ARNOULD Mickaël et LEMAIRE Noémie } (ok)&lt;br /&gt;
#* Biométrie { BACART Aurélien et BAH Abdoulaye } (ok)&lt;br /&gt;
#* Sécurité et mobile : nouvelle cible des pirates { GEVET Gwénaël et YANG Yang } (ok)&lt;br /&gt;
#* Sécurité et [http://www.infosafe.fr/Armoirefortedin/Armoirefortedin.htm armoire forte ignifuge] pour les sauvegardes de données&lt;br /&gt;
#* Injections SQL &amp;amp; faille XSS { GUILLOT Pierre &amp;amp; KRATTINGER Thibaut }&lt;br /&gt;
#* La cryptographie militaire { GIUNCHI Ryan &amp;amp; CIMINERA Lary }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2011/2012 ==&lt;br /&gt;
&lt;br /&gt;
A vous de proposer des sujets d&#039;exposés... Prévoir 15min d&#039;exposé, suivi de 5min de questions.&lt;br /&gt;
&lt;br /&gt;
#* La sécurité des cartes bancaires (ok) { DORIEN Christophe et LAPIERRE Rémy }&lt;br /&gt;
#* La cyberguerre (ok) {MAIRE Cyril et MONTCHAL Justine}&lt;br /&gt;
#* La sécurité sur les sites Web (ok) {RABARIJAONA Domoina et BERTHET Vincent}&lt;br /&gt;
#* Virus et antivirus (ok) {EL AZHAR Said}&lt;br /&gt;
#* Présentation et explication de l&#039;attaque par le virus Stuxnet (ok) {PIRAT Victor et MENDES Etienne}&lt;br /&gt;
#* Vulnérabilités des smartphones (ok) {Titouan VAN BELLE et Jean-Baptiste PAUMIER}&lt;br /&gt;
#* L&#039;histoire de la cryptographie (ok) {Costa Jean-Philippe et Morel Julien}&lt;br /&gt;
#* L&#039;Informatique Ambiante et La Sécurité:Quel Protocole? (ok) {Marclin LEON et Farid BOUKHEDDAD}&lt;br /&gt;
#* Systèmes physiques de génération de nombres aléatoires : principes et avantages. (ok) {Florent Carral et Julie Tacheau}&lt;br /&gt;
#* Présentation des Honeypots (ok) {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2010/2011 ==&lt;br /&gt;
&lt;br /&gt;
# Les exposés auront lieu le mercredi 23/3/2011 après-midi, et jeudi 24/3/2011 à partir de 13h30 selon le nb d&#039;exposés. Prévoir 15min d&#039;exposé, suivi de 5min de questions. L&#039;ordre proposé est celui ci-dessous. N&#039;hésitez pas à échanger entre vous.&lt;br /&gt;
&lt;br /&gt;
#* Sécurité des réseaux sans fils (ok) { ZHONG Jie et GONZALEZ Miguel }&lt;br /&gt;
#* La cyberguerre (ok) { SOUBEYRAND Martin et ROBART Laetitia }&lt;br /&gt;
#* Le principe de VPN et les attaques de VPN (ok) { DU Peng }&lt;br /&gt;
#* La signature numérique (ok) { DJEDDI Abdelkader }&lt;br /&gt;
#* Présentation de quelques attaques informatiques et quelques solutions proposées pour y remédier dans les réseaux P2P (ok) { Lila Zane et Ouhemmi }&lt;br /&gt;
#* Sécurité dans les cartes à puce (ok) { LAGHA Youssef et Nodari }&lt;br /&gt;
#* Evolution de la cryptologie à travers les âges (ok, mais vaste !) { DEBAENE Aurélien et VINCENT Christophe }&lt;br /&gt;
#* Biométrie (ok) { ZANE Bania et MENTDAHI Houda }&lt;br /&gt;
#* Comparaison de différents logiciels de crackage (ok) { AMBLARD Mathieu }&lt;br /&gt;
#* Construire des bons mots de passe { Liu Siqi }&lt;br /&gt;
#* La Machine Enigma (ok) { JULLIAN-DESAYES Jeremy et GARDET Nicolas }&lt;br /&gt;
#* Calculateurs quantiques et applications en cryptographie { BORCARD Justine et CATHELIN Gaël }&lt;br /&gt;
#* Présentation des Honeypots {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2009/2010) ==&lt;br /&gt;
&lt;br /&gt;
Les exposés se feront dans l&#039;ordre suivant. Vous pouvez vous mettre d&#039;accord entre vous pour échanger.&lt;br /&gt;
&lt;br /&gt;
# Lundi 14/12 après-midi&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
# Mardi 15/12 après-midi&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONNET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
# Mercredi 16/12 après-midi&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Securité des réseaux sans fils (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2009/2010 ==&lt;br /&gt;
&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Fuites de donnée en entreprise (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
#* PGP et la sécurité de l&#039;information {Cyrille Mortier}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2008/2009 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 30/1 de 8h à 12h (4CANTONS - 64) et de 13h30 à 17h30 (4CANTONS - 65). Les exposés sont à faire par binôme (ou monôme) et doivent durer 20 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés. &lt;br /&gt;
&lt;br /&gt;
#* Les Protocoles de sécurité dans les réseaux WiFi (WEP et WPA) &amp;lt;&amp;lt;&amp;lt;&amp;lt; { Mickaël Wang &amp;amp; Arnaud Villevieille } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/Securite-wifi.pdf PDF]&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison { Anis HADJALI &amp;amp; Vlad VESA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/analyse-securite.pdf PDF]&lt;br /&gt;
#* Google Hacking { Julien ARNOUX &amp;amp; Jeremy DEPOIL } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ghack.pptx PPTX]&lt;br /&gt;
#* Virus et antivirus { Mehdi M. et Christophe M. }&lt;br /&gt;
#* 3DSecure { Natalia Lecoeur &amp;amp; Cindy Chiaberto } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/3D_Secure.pdf PDF]&lt;br /&gt;
#* Sécurité sous Linux en entreprise { Joël Leroy  Ebouele &amp;amp; Barbier Keller }&lt;br /&gt;
#* Techniques et outils de chiffrements de partitions [Valat Sebastien &amp;amp; Bouleis Romain]&lt;br /&gt;
#* IP Spoofing et DNS Spoofing { Alberic Martel &amp;amp; Fabien Dezempte ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ip-dns-spoofing.ppt PPT]&lt;br /&gt;
#* PRA le Plan de Reprise d&#039;Activité {Achraf AMEUR}&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques {Renneville Guybert et Fabrice Noraz}&lt;br /&gt;
#* La gestion des DRM  {Petithory Thomas &amp;amp; Paccard Charléric}&lt;br /&gt;
#* L&#039;introduction SSL,SSH { Julien Roche &amp;amp; Yi Wang }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2007/2008 ==&lt;br /&gt;
&lt;br /&gt;
Exposés le mardi 26/2 de 8h15 à 11h30 et le mercredi 27/2 de 8h15 à 11h30. Les exposés sont à faire par binôme et doivent durer 25 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés.&lt;br /&gt;
&lt;br /&gt;
# Sujets d&#039;exposés (propositions, à étoffer)&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Presentation_cryptologie_PAVLOU_DALLA_COSTA_512.mov MOV]&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Cryptologie_et_securite_informatique_-_Fernandes.pdf PDF]&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Les_attaques_mediatisees_-_PIPARO_HUMBERT.pdf PDF]&lt;br /&gt;
#* La mise en place de la sécurité informatique au niveau national et international : CERTs, sites AntiSPAM&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Expose_securite_sur_le_XSS_-_Roche_et_Serra.pdf PDF]&lt;br /&gt;
#* Virus et antivirus&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, CIMINERA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Watermarking_Ciminera_Maeseele.pdf PDF]&lt;br /&gt;
#* La gestion des DRM&lt;br /&gt;
#* Les certificats (PGP, X509) et les infrastructures de gestion de clés &lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* IPsec&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison  &lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/presentation_VIALA_FOLLIET.pdf PDF]&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/OpenBSD_-_Revelin-Errochdi.pdf PDF]&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Securite_GPRS_-PEHME_REY.pdf PDF]&lt;br /&gt;
# Planning des exposés Mardi 12/2/2008&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES}&lt;br /&gt;
# Mardi 27/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI)&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA}&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA }&lt;br /&gt;
# Planning des exposés Mercredi 28/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY)&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT }&lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE )&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, ??? }&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10526</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10526"/>
		<updated>2018-11-09T15:13:45Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractère sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 octets ==&amp;gt; trois bloc de 64 bit&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt qui utilise l&#039;agolrithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;ctext&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré le state des sous-clés, on prend la chaîne de caractère magique &#039;&#039;&#039;OrpheanBeholderScryDoubt&#039;&#039;&#039; sur 192 bits qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec le state de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est que l’algorithme utilisé est lent ce qui dissuade les attaques par brute force ou avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est lent. Ceci est notamment utile au vu de l&#039;évolution des CPU et GPU sachant que la taille des mots de passe reste constante. En effet les humains ont besoin de pourvoir facilement retenir le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Quel coût choisir pour bcrypt ? &lt;br /&gt;
&lt;br /&gt;
Tel est la question que chaque développeur doit se poser s&#039;il veut utiliser bcrypt. &lt;br /&gt;
En effet, le coût aussi connu sous le nom de &amp;quot;force de travail&amp;quot; se doit d&#039;être suffisamment grand pour que bcrypt soit le plus lent possible sans affecter l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;br /&gt;
&lt;br /&gt;
https://www.commonlounge.com/discussion/d95616beecc148daaa23f35178691c35&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10498</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10498"/>
		<updated>2018-11-05T21:48:10Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique [https://fr.wikipedia.org/wiki/Blowfish Blowfish] :  &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pour Blowfish et &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
===1. Génération des sous-clés avec la fonction &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; (pour &#039;&#039;Expensive Key Schedule Blowfish&#039;&#039;)===&lt;br /&gt;
Cette fonction prend 3 paramètres : &lt;br /&gt;
* &#039;&#039;&#039;cost&#039;&#039;&#039; Le coût souhaité de l&#039;algorithme (&#039;&#039;Nombre entre 4 et 31&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;salt&#039;&#039;&#039; Le sel qui correspond à une chaîne de caractère  (&#039;&#039;Tableau de 16 octets&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;key&#039;&#039;&#039; le mot de passe que l&#039;on souhaite hacher (&#039;&#039;Chaîne de caractère sur 1 à 72 octets&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
 EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; InitState()&lt;br /&gt;
     &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (2&amp;lt;sup&amp;gt;&#039;&#039;cost&#039;&#039;&amp;lt;/sup&amp;gt;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
         &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; ExpandKey(&#039;&#039;state&#039;&#039;, 0, &#039;&#039;salt&#039;&#039;)&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; &#039;&#039;state&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===2. Chiffrement avec une partie des sous-clés===&lt;br /&gt;
 bcrypt(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)&lt;br /&gt;
    &#039;&#039;state&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EksBlowfishSetup(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;key&#039;&#039;)  &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//Encrypt le texte &amp;quot;OrpheanBeholderScryDoubt&amp;quot; 64 fois&amp;lt;/span&amp;gt;&lt;br /&gt;
    &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;color: maroon&amp;quot;&amp;gt;&#039;&#039;&amp;quot;OrpheanBeholderScryDoubt&amp;quot;&#039;&#039;&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//24 octets ==&amp;gt; trois bloc de 64 bit&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;repeat&#039;&#039;&#039;&amp;lt;/span&amp;gt; (64)&lt;br /&gt;
       &#039;&#039;ctext&#039;&#039; &amp;lt;math&amp;gt;\gets&amp;lt;/math&amp;gt; EncryptECB(&#039;&#039;state&#039;&#039;, &#039;&#039;ctext&#039;&#039;) &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//encrypt qui utilise l&#039;agolrithme Blowfish en mode ECB&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;//&#039;&#039;ctext&#039;&#039; sur 24 octets comme résulat du hash&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color: #004DBB;&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/span&amp;gt; Concatenate(&#039;&#039;cost&#039;&#039;, &#039;&#039;salt&#039;&#039;, &#039;&#039;ctext&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Après avoir généré le state des sous-clés, on prend la chaîne de caractère magique &#039;&#039;&#039;OrpheanBeholderScryDoubt&#039;&#039;&#039; sur 192 bits qu&#039;on va encrypter 64 fois en utilisant &amp;lt;code&amp;gt;eksblowfish&amp;lt;/code&amp;gt; en EBC Mode avec le state de la phase précédente.&lt;br /&gt;
&lt;br /&gt;
Le résultat est ensuite préfixé par &amp;lt;code&amp;gt;$2a$&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2y$&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;$2b$&amp;lt;/code&amp;gt; suivant la version de &amp;lt;code&amp;gt;bcrypt&amp;lt;/code&amp;gt; utilisé.&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
L&#039;intérêt par rapport à d&#039;autre fonction de hachage comme md5 ou sha1 est quel l’algorithme utilisé est lent ce qui rend les attaques par brute force ou avec une table arc-en-ciel inutilisable pour un attaquant.&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus le hachage est long.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;br /&gt;
&lt;br /&gt;
https://auth0.com/blog/hashing-in-action-understanding-bcrypt/&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10491</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10491"/>
		<updated>2018-11-04T00:19:55Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Les étapes du chiffrement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
# Génération des sous-clés avec &lt;br /&gt;
# Chiffrement avec une partie des sous-clés&lt;br /&gt;
$wgAllowExternalImages&lt;br /&gt;
https://www.rencontres-arles.com/files/media_thumbnail_2107.jpg&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus &lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10490</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10490"/>
		<updated>2018-11-04T00:10:50Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
# Génération des sous-clés avec &lt;br /&gt;
# Chiffrement avec une partie des sous-clés&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus &lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10489</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10489"/>
		<updated>2018-11-03T23:51:48Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les étapes du chiffrement ==&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations. Plus le nombre d&#039;itérations est important, plus &lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10484</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10484"/>
		<updated>2018-11-03T23:37:24Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Complexifier le déchiffrement avec le salage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10483</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10483"/>
		<updated>2018-11-03T23:37:04Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
== Complexifier le déchiffrement avec le salage ==&lt;br /&gt;
Le problème des fonctions de hachage usuelles est qu&#039;elles sont injectives (ou presque). Le principe du salage est d&#039;ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.&lt;br /&gt;
&lt;br /&gt;
Le salage aléatoire réduit l&#039;efficacité de l&#039;attaque par dictionnaire (surtout si le dictionnaire ne contient qu&#039;un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l&#039;attaque avec une table arc-en-ciel.&lt;br /&gt;
&lt;br /&gt;
La condition de l&#039;efficacité du salage est que le sel ne doit pas être connu de l&#039;attaquant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Salage_(cryptographie)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10481</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10481"/>
		<updated>2018-11-03T22:56:17Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Bcrypt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de chiffrement symétrique Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== Les particularités de Bcrypt ==&lt;br /&gt;
Pourquoi utiliser Bcrypt par rapport à d&#039;autres fonctions de hachage ?&lt;br /&gt;
&lt;br /&gt;
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d&#039;itérations.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10474</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10474"/>
		<updated>2018-11-03T15:44:23Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;algorithme Blowfish */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de cryptage Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
== L&#039;algorithme Blowfish ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10473</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10473"/>
		<updated>2018-11-03T13:08:42Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de cryptage Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
=== L&#039;algorithme Blowfish ===&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Blowfish_(cipher)&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10472</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10472"/>
		<updated>2018-11-03T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Bcrypt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l&#039;algorithme de cryptage Blowfish. Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...&lt;br /&gt;
&lt;br /&gt;
=== L&#039;algorithme Blowfish ===&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10469</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10469"/>
		<updated>2018-11-03T00:36:16Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Qu&amp;#039;est-ce que Bcrypt ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
Bcrypt est une fonction de hachage. Créé par Niels Provos et David Mazières, et basée sur Blowfish&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10468</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10468"/>
		<updated>2018-11-03T00:25:00Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Attaques possibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque brute force ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une table arc-en-ciel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10467</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10467"/>
		<updated>2018-11-03T00:20:28Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque par collisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt; où &amp;quot;.&amp;quot; est la concaténation. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10466</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10466"/>
		<updated>2018-11-03T00:19:09Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque par collisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels &amp;lt;math&amp;gt;h(A.B) = h(C.D) &amp;lt;/math&amp;gt;. Ainsi, les couples &amp;lt;math&amp;gt;(A,B,C,D)&amp;lt;/math&amp;gt; nous donnent plus d&#039;indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10465</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10465"/>
		<updated>2018-11-02T23:27:30Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Attaque_de_collisions&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10464</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10464"/>
		<updated>2018-11-02T23:25:07Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque par collisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;attaque avec préfixes choisis&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10463</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10463"/>
		<updated>2018-11-02T23:24:14Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque par collisions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
L&#039;attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n&#039;est pas tout à fait injective.&lt;br /&gt;
&lt;br /&gt;
Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage. &lt;br /&gt;
&lt;br /&gt;
Cette attaque se découpe en 2 variantes :&lt;br /&gt;
* L&#039;attaque classique&lt;br /&gt;
On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.&lt;br /&gt;
&amp;lt;math&amp;gt;(x,y) \in L, x \ne y, h(x) = h(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10462</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10462"/>
		<updated>2018-11-02T23:04:39Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque brute force */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10461</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10461"/>
		<updated>2018-11-02T23:01:33Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* L&amp;#039;attaque brute force */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble. &lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var trouve = faux;&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que trouve = faux et que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10460</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10460"/>
		<updated>2018-11-02T18:48:57Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Attaques possibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque &#039;&#039;&#039;brute force&#039;&#039;&#039; ===&lt;br /&gt;
Il s&#039;agit de l&#039;attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l&#039;ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés &#039;&#039;&#039;dictionnaire&#039;&#039;&#039;, qui contient cet ensemble.&lt;br /&gt;
&lt;br /&gt;
 Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string&lt;br /&gt;
 Début&lt;br /&gt;
     var trouve = faux;&lt;br /&gt;
     var i = 0;&lt;br /&gt;
     Tant que trouve = faux et que i &amp;lt; dictionnaire.taille&lt;br /&gt;
     Faire&lt;br /&gt;
         Si h(dictionnaire.get(i)) == hache&lt;br /&gt;
             Retourner dictionnaire.get(i);&lt;br /&gt;
     i = i + 1;&lt;br /&gt;
     Fin Tant que&lt;br /&gt;
 Retourner &amp;quot;&amp;quot;;&lt;br /&gt;
 Fin&lt;br /&gt;
&lt;br /&gt;
=== L&#039;attaque avec une &#039;&#039;&#039;table arc-en-ciel&#039;&#039;&#039; ===&lt;br /&gt;
=== L&#039;attaque par collisions ===&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10459</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10459"/>
		<updated>2018-11-02T18:31:28Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Quelques définitions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.&lt;br /&gt;
&lt;br /&gt;
; Empreinte&lt;br /&gt;
: Une empreinte est le résultat d&#039;une fonction de hachage sur un clair. Une empreinte est aussi appelée une &#039;&#039;&#039;hash value&#039;&#039;&#039;, un &#039;&#039;&#039;hash code&#039;&#039;&#039;, un &#039;&#039;&#039;digest&#039;&#039;&#039; ou encore un &#039;&#039;&#039;hash&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10458</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10458"/>
		<updated>2018-11-02T18:16:26Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Attaques possibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage ...&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles =&lt;br /&gt;
Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10457</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10457"/>
		<updated>2018-11-02T18:12:41Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Processus d&amp;#039;authentification sur un site web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage ...&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
L&#039;identification d&#039;un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d&#039;un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le cryptage respecte le secret parfait).&lt;br /&gt;
&lt;br /&gt;
Le procédé est le suivant :&lt;br /&gt;
&lt;br /&gt;
# L&#039;utilisateur saisit son identifiant et son mot de passe (le clair).&lt;br /&gt;
# Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.&lt;br /&gt;
# Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.&lt;br /&gt;
# Si les 2 hachés correspondent alors, l’utilisateur est authentifié.&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10456</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10456"/>
		<updated>2018-10-27T15:48:43Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage ...&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Hash_function&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10455</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10455"/>
		<updated>2018-10-27T15:48:11Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Le nombre de pirates ne cesse d&#039;augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.&lt;br /&gt;
&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
&lt;br /&gt;
; Fonction de hachage&lt;br /&gt;
: Une fonction de hachage ...&lt;br /&gt;
&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10454</id>
		<title>INFO002 : Cryptologie</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10454"/>
		<updated>2018-10-27T15:28:36Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Sujets d&amp;#039;exposés pour l&amp;#039;année 2018/2019 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
# Cours &lt;br /&gt;
#* Support de cours (presentation [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/cours.pdf PDF], article [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/article.pdf PDF])&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TDs 1 : cryptographie élémentaire [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/TDs/td-1.ps PDF]&lt;br /&gt;
# TPs et autres travaux pratiques [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Tests/doc/html/index.html Pages des TPs]&lt;br /&gt;
# Autres ressources&lt;br /&gt;
#* Handbook of Applied Cryptology [http://www.cacr.math.uwaterloo.ca/hac/]&lt;br /&gt;
#* Cryptologie en ligne [http://www.apprendre-en-ligne.net/crypto/menu/index.html]&lt;br /&gt;
# [[Projets étudiants cryptographie et sécurité]]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2018/2019 ==&lt;br /&gt;
&lt;br /&gt;
Créez les liens vers vos wikis ci-dessous (comme les autres).&lt;br /&gt;
&lt;br /&gt;
# Bcrypt { A. PETETIN, F. SEBIRE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Bcrypt Bcrypt]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2017/2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Stéganographie { S. BARNIAUDY, S. DUPRAZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Steganographie stéganographie]&lt;br /&gt;
# Pretty Good Privacy { M. PELLET, B. LE SAUX } [https://lama.univ-savoie.fr/mediawiki/index.php?title=Pretty_Good_Privacy Pretty Good Privacy]&lt;br /&gt;
# Cryptographie Visuelle { T. COUPECHOUX, N. TASCA} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=CryptographieVisuelle Cryptographie Visuelle]&lt;br /&gt;
# Prise de contrôle à distance de la machine Windows 7 par une faille sur acrobat reader 9, preuve par l&#039;exemple de l&#039;intérêt des mises à jours { A. CHIVOT, P. PASQUIER, T. NOWICKI} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=HackWind7FailleAcrobR7 Attaque Windows 7 par une faille sur acrobat reader 9 via Metasploit]&lt;br /&gt;
# Authentification via fingerprint { Z. CIMINERA, A. HURSTEL, F. VOUILLAMOZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Autentification_via_fingerprint Autentification via fingerprint]&lt;br /&gt;
# Ransomwares { L. FERREIRA-GOMEZ, S. BERCHERY } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Ransomware Ransomwares]&lt;br /&gt;
# Cryptomonnaie { A. PORCHERON-ROCHE, L. JOMMETTI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Cryptomonnaie Crypto-monnaie]&lt;br /&gt;
# Sécurité des réseaux sans fils WEP, WPA { M. LEBLANC, M.-O. DIALLO } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Securite_des_reseaux_WEP_WPA Sécurité des Réseaux WEP &amp;amp;amp; WPA]&lt;br /&gt;
# le chiffre ADFGVX { M. OUALI-ALAMI, O. SOUISSI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Le_chiffre_ADFGVX le chiffre ADFGVX]&lt;br /&gt;
# La sécurité de la couche physique du RFID { J. MANGANONI, F. PRISCOGLIO } --[https://lama.univ-savoie.fr/mediawiki/index.php/Attaque_des_supports_sans_contact_type_RFID_et_NFC Sécurité du RFID]&lt;br /&gt;
# Blockchains { A. BADAJ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Blochchain Blockchains]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2016/2017 ==&lt;br /&gt;
&lt;br /&gt;
# Carré de Polybe { C. Farnier, B. Lauret } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Carre_de_Polybe Carré de Polybe]&lt;br /&gt;
# Cryptographie sur courbe elliptique (ECC) et l&#039;échange de clés Diffie-Hellman sur une courbe elliptique (ECDH) { P. Clavier }&lt;br /&gt;
# Sécurité des réseaux mobiles { G. Charvier, G. Yoccoz } -- [https://lama.univ-savoie.fr/mediawiki/index.php/GSM_Security La sécurité du réseau GSM]&lt;br /&gt;
# Sécurité des fichiers de format commun { A. De-Laere, T. Martin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/S%C3%A9curit%C3%A9_des_fichiers_de_format_commun Sécurité des fichiers de format commun]&lt;br /&gt;
# Sécurité des appareils mobiles { B. Vaudey, B. Toneghin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Sécurité_appareil_mobile Sécurité des appareils mobiles]&lt;br /&gt;
# Vulnérabilité des réseaux lorawan { H. A. RAKOTOARIVONY, N. Y. P. RANDRIANJATOVO } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Vulnerabilite_du_reseaux_lorawan Vulnerabilite des reseaux lorawan]&lt;br /&gt;
# Injections SQL (SQLi) et méthodes de protection { R. Rebillard, L. Robergeon } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Injections_SQL_et_m%C3%A9thodes_de_protection WikiSQLi]&lt;br /&gt;
# Social engineering { A. Senger, J. Manceaux } [https://lama.univ-savoie.fr/mediawiki/index.php/Social_engineering Social engineering]&lt;br /&gt;
# Courbes elliptiques pour la sécurité informatique {J. Suzan, G. Zablocki }&lt;br /&gt;
# Application &amp;quot;textsecure&amp;quot; { F. Ribard, A. Abdelmoumni } -- [https://lama.univ-savoie.fr/mediawiki/index.php/TextSecure WikiTextSecure]&lt;br /&gt;
# Cryptographie Visuelle { N. Baudon, G. Gomila, A. Vincent } -- [http://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptographie_Visuelle Cryptographie visuelle]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2014/2015 ==&lt;br /&gt;
&lt;br /&gt;
# Cryptologie VS NSA { H. Ramamonjy, N.E. Ould Kadi }&lt;br /&gt;
# le Bitcoin { H. Helbawi, A. Tang, J. }&lt;br /&gt;
# le virus &amp;quot;stuxnet&amp;quot; { N. Challut et T. Chisci }&lt;br /&gt;
# Google Recaptcha { A. SAYAH, A. EL-HARRAS }&lt;br /&gt;
# La cryptographie dans l&#039;antiquité { Y. Lombardi, G. Badin }&lt;br /&gt;
# La sécurité des cartes bancaires { M. Salvat, Y. Salti }&lt;br /&gt;
# Cryptolocker { W. Lecable, M. Genovese }&lt;br /&gt;
# La machine de Turing et ses variantes { C. Laignel, P.E. Roux }&lt;br /&gt;
# La machine ENIGMA { B. Da Silva, G. Ply }&lt;br /&gt;
# La stéganographie { K. Deléglise, Y. Rakotonanahary }&lt;br /&gt;
# Sécurité des cartes bancaires { A. Bigane, F. Way }&lt;br /&gt;
# Le craquage de la cryptographie quantique ? { D. Cauwet, A. Hauguel }&lt;br /&gt;
# Le paiement par NFC { J. Maurice, S. Zehnder }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2013/2014 ==&lt;br /&gt;
&lt;br /&gt;
#* Le cryptosystème Bitcoin { Johanny Clerc-Renaud &amp;amp; Clément Montigny }&lt;br /&gt;
#* La stéganographie { Bosviel Thomas &amp;amp; Tolron Sebastien}&lt;br /&gt;
#* AES { Avet Anthony &amp;amp; Duraz Aurélien }&lt;br /&gt;
#* Payement NFC { Montouchet Raphaël &amp;amp; Marois Jeremy }&lt;br /&gt;
#* La sécurité dans les box de FAI { Charron Thomas &amp;amp; Mesurolle Anthony }&lt;br /&gt;
#* La technologie RFID et la sécurité { CHANTREL Thierry &amp;amp; SEZILLE Aurélien }&lt;br /&gt;
#* Le Cloud et la Cryptologie { Capellaro Alexandre &amp;amp; Chabert Cédric }&lt;br /&gt;
#* La sécurité et les chaines TV cryptées { CINDOLO Giuseppe &amp;amp; NARETTO Benjamin }&lt;br /&gt;
#* Tunneling TCP/IP via SSH {RAHARISON Laurent &amp;amp; JEAN FRANÇOIS Michael}&lt;br /&gt;
#* Principes et techniques de génération de nombres aléatoires {BERTHON Yohann &amp;amp; KELFANI Hugo &amp;amp; REY Anthony}&lt;br /&gt;
#* Sécurité atypique et empreintes des navigateurs {FONTANA Antonin}&lt;br /&gt;
#* La sécurité des monnaies électroniques {BUISSON Valentin &amp;amp; GENY-DUMONT Rémi}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2012/2013 ==&lt;br /&gt;
&lt;br /&gt;
#* Nouvelle philosophie de partage de fichiers avec MEGA { WAYNTAL David et DOMINATI Nicolas } (ok)&lt;br /&gt;
#* La cyberguerre { COLIN François et APPREDERISSE Benjamin } (ok)&lt;br /&gt;
#* Octobre Rouge { REGAZZONI Rudy et LOMBARD Adrien } (ok)&lt;br /&gt;
#* HTTPS et SSL { ASSIER Aymeric et ROLLINGER Claire } (ok)&lt;br /&gt;
#* DMZ { COLLOMB Camille et LAURENT Corantin } (ok)&lt;br /&gt;
#* Failles de sécurité des systèmes informatiques de grandes entreprises (LinkedIn, Apple, Sony, ...) { ARNOULD Mickaël et LEMAIRE Noémie } (ok)&lt;br /&gt;
#* Biométrie { BACART Aurélien et BAH Abdoulaye } (ok)&lt;br /&gt;
#* Sécurité et mobile : nouvelle cible des pirates { GEVET Gwénaël et YANG Yang } (ok)&lt;br /&gt;
#* Sécurité et [http://www.infosafe.fr/Armoirefortedin/Armoirefortedin.htm armoire forte ignifuge] pour les sauvegardes de données&lt;br /&gt;
#* Injections SQL &amp;amp; faille XSS { GUILLOT Pierre &amp;amp; KRATTINGER Thibaut }&lt;br /&gt;
#* La cryptographie militaire { GIUNCHI Ryan &amp;amp; CIMINERA Lary }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2011/2012 ==&lt;br /&gt;
&lt;br /&gt;
A vous de proposer des sujets d&#039;exposés... Prévoir 15min d&#039;exposé, suivi de 5min de questions.&lt;br /&gt;
&lt;br /&gt;
#* La sécurité des cartes bancaires (ok) { DORIEN Christophe et LAPIERRE Rémy }&lt;br /&gt;
#* La cyberguerre (ok) {MAIRE Cyril et MONTCHAL Justine}&lt;br /&gt;
#* La sécurité sur les sites Web (ok) {RABARIJAONA Domoina et BERTHET Vincent}&lt;br /&gt;
#* Virus et antivirus (ok) {EL AZHAR Said}&lt;br /&gt;
#* Présentation et explication de l&#039;attaque par le virus Stuxnet (ok) {PIRAT Victor et MENDES Etienne}&lt;br /&gt;
#* Vulnérabilités des smartphones (ok) {Titouan VAN BELLE et Jean-Baptiste PAUMIER}&lt;br /&gt;
#* L&#039;histoire de la cryptographie (ok) {Costa Jean-Philippe et Morel Julien}&lt;br /&gt;
#* L&#039;Informatique Ambiante et La Sécurité:Quel Protocole? (ok) {Marclin LEON et Farid BOUKHEDDAD}&lt;br /&gt;
#* Systèmes physiques de génération de nombres aléatoires : principes et avantages. (ok) {Florent Carral et Julie Tacheau}&lt;br /&gt;
#* Présentation des Honeypots (ok) {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2010/2011 ==&lt;br /&gt;
&lt;br /&gt;
# Les exposés auront lieu le mercredi 23/3/2011 après-midi, et jeudi 24/3/2011 à partir de 13h30 selon le nb d&#039;exposés. Prévoir 15min d&#039;exposé, suivi de 5min de questions. L&#039;ordre proposé est celui ci-dessous. N&#039;hésitez pas à échanger entre vous.&lt;br /&gt;
&lt;br /&gt;
#* Sécurité des réseaux sans fils (ok) { ZHONG Jie et GONZALEZ Miguel }&lt;br /&gt;
#* La cyberguerre (ok) { SOUBEYRAND Martin et ROBART Laetitia }&lt;br /&gt;
#* Le principe de VPN et les attaques de VPN (ok) { DU Peng }&lt;br /&gt;
#* La signature numérique (ok) { DJEDDI Abdelkader }&lt;br /&gt;
#* Présentation de quelques attaques informatiques et quelques solutions proposées pour y remédier dans les réseaux P2P (ok) { Lila Zane et Ouhemmi }&lt;br /&gt;
#* Sécurité dans les cartes à puce (ok) { LAGHA Youssef et Nodari }&lt;br /&gt;
#* Evolution de la cryptologie à travers les âges (ok, mais vaste !) { DEBAENE Aurélien et VINCENT Christophe }&lt;br /&gt;
#* Biométrie (ok) { ZANE Bania et MENTDAHI Houda }&lt;br /&gt;
#* Comparaison de différents logiciels de crackage (ok) { AMBLARD Mathieu }&lt;br /&gt;
#* Construire des bons mots de passe { Liu Siqi }&lt;br /&gt;
#* La Machine Enigma (ok) { JULLIAN-DESAYES Jeremy et GARDET Nicolas }&lt;br /&gt;
#* Calculateurs quantiques et applications en cryptographie { BORCARD Justine et CATHELIN Gaël }&lt;br /&gt;
#* Présentation des Honeypots {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2009/2010) ==&lt;br /&gt;
&lt;br /&gt;
Les exposés se feront dans l&#039;ordre suivant. Vous pouvez vous mettre d&#039;accord entre vous pour échanger.&lt;br /&gt;
&lt;br /&gt;
# Lundi 14/12 après-midi&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
# Mardi 15/12 après-midi&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONNET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
# Mercredi 16/12 après-midi&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Securité des réseaux sans fils (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2009/2010 ==&lt;br /&gt;
&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Fuites de donnée en entreprise (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
#* PGP et la sécurité de l&#039;information {Cyrille Mortier}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2008/2009 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 30/1 de 8h à 12h (4CANTONS - 64) et de 13h30 à 17h30 (4CANTONS - 65). Les exposés sont à faire par binôme (ou monôme) et doivent durer 20 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés. &lt;br /&gt;
&lt;br /&gt;
#* Les Protocoles de sécurité dans les réseaux WiFi (WEP et WPA) &amp;lt;&amp;lt;&amp;lt;&amp;lt; { Mickaël Wang &amp;amp; Arnaud Villevieille } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/Securite-wifi.pdf PDF]&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison { Anis HADJALI &amp;amp; Vlad VESA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/analyse-securite.pdf PDF]&lt;br /&gt;
#* Google Hacking { Julien ARNOUX &amp;amp; Jeremy DEPOIL } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ghack.pptx PPTX]&lt;br /&gt;
#* Virus et antivirus { Mehdi M. et Christophe M. }&lt;br /&gt;
#* 3DSecure { Natalia Lecoeur &amp;amp; Cindy Chiaberto } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/3D_Secure.pdf PDF]&lt;br /&gt;
#* Sécurité sous Linux en entreprise { Joël Leroy  Ebouele &amp;amp; Barbier Keller }&lt;br /&gt;
#* Techniques et outils de chiffrements de partitions [Valat Sebastien &amp;amp; Bouleis Romain]&lt;br /&gt;
#* IP Spoofing et DNS Spoofing { Alberic Martel &amp;amp; Fabien Dezempte ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ip-dns-spoofing.ppt PPT]&lt;br /&gt;
#* PRA le Plan de Reprise d&#039;Activité {Achraf AMEUR}&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques {Renneville Guybert et Fabrice Noraz}&lt;br /&gt;
#* La gestion des DRM  {Petithory Thomas &amp;amp; Paccard Charléric}&lt;br /&gt;
#* L&#039;introduction SSL,SSH { Julien Roche &amp;amp; Yi Wang }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2007/2008 ==&lt;br /&gt;
&lt;br /&gt;
Exposés le mardi 26/2 de 8h15 à 11h30 et le mercredi 27/2 de 8h15 à 11h30. Les exposés sont à faire par binôme et doivent durer 25 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés.&lt;br /&gt;
&lt;br /&gt;
# Sujets d&#039;exposés (propositions, à étoffer)&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Presentation_cryptologie_PAVLOU_DALLA_COSTA_512.mov MOV]&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Cryptologie_et_securite_informatique_-_Fernandes.pdf PDF]&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Les_attaques_mediatisees_-_PIPARO_HUMBERT.pdf PDF]&lt;br /&gt;
#* La mise en place de la sécurité informatique au niveau national et international : CERTs, sites AntiSPAM&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Expose_securite_sur_le_XSS_-_Roche_et_Serra.pdf PDF]&lt;br /&gt;
#* Virus et antivirus&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, CIMINERA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Watermarking_Ciminera_Maeseele.pdf PDF]&lt;br /&gt;
#* La gestion des DRM&lt;br /&gt;
#* Les certificats (PGP, X509) et les infrastructures de gestion de clés &lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* IPsec&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison  &lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/presentation_VIALA_FOLLIET.pdf PDF]&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/OpenBSD_-_Revelin-Errochdi.pdf PDF]&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Securite_GPRS_-PEHME_REY.pdf PDF]&lt;br /&gt;
# Planning des exposés Mardi 12/2/2008&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES}&lt;br /&gt;
# Mardi 27/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI)&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA}&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA }&lt;br /&gt;
# Planning des exposés Mercredi 28/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY)&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT }&lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE )&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, ??? }&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10453</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10453"/>
		<updated>2018-10-27T15:15:08Z</updated>

		<summary type="html">&lt;p&gt;Petetin : /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
== Quelques définitions ==&lt;br /&gt;
== Processus d&#039;authentification sur un site web ==&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10452</id>
		<title>Bcrypt</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Bcrypt&amp;diff=10452"/>
		<updated>2018-10-27T15:12:28Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 Auteurs : Antoine Petetin et Florian Sebire&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Attaques possibles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Bcrypt=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Bcrypt ? ==&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Bcrypt&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10451</id>
		<title>INFO002 : Cryptologie</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO002_:_Cryptologie&amp;diff=10451"/>
		<updated>2018-10-27T14:00:27Z</updated>

		<summary type="html">&lt;p&gt;Petetin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
# Cours &lt;br /&gt;
#* Support de cours (presentation [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/cours.pdf PDF], article [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Cours/article.pdf PDF])&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TDs 1 : cryptographie élémentaire [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/TDs/td-1.ps PDF]&lt;br /&gt;
# TPs et autres travaux pratiques [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO910/Tests/doc/html/index.html Pages des TPs]&lt;br /&gt;
# Autres ressources&lt;br /&gt;
#* Handbook of Applied Cryptology [http://www.cacr.math.uwaterloo.ca/hac/]&lt;br /&gt;
#* Cryptologie en ligne [http://www.apprendre-en-ligne.net/crypto/menu/index.html]&lt;br /&gt;
# [[Projets étudiants cryptographie et sécurité]]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2018/2019 ==&lt;br /&gt;
&lt;br /&gt;
Créez les liens vers vos wikis ci-dessous (comme les autres).&lt;br /&gt;
&lt;br /&gt;
# Bcrypt { A. PETETIN, F. SEBIRE } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Bcrypt]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2017/2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Stéganographie { S. BARNIAUDY, S. DUPRAZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Steganographie stéganographie]&lt;br /&gt;
# Pretty Good Privacy { M. PELLET, B. LE SAUX } [https://lama.univ-savoie.fr/mediawiki/index.php?title=Pretty_Good_Privacy Pretty Good Privacy]&lt;br /&gt;
# Cryptographie Visuelle { T. COUPECHOUX, N. TASCA} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=CryptographieVisuelle Cryptographie Visuelle]&lt;br /&gt;
# Prise de contrôle à distance de la machine Windows 7 par une faille sur acrobat reader 9, preuve par l&#039;exemple de l&#039;intérêt des mises à jours { A. CHIVOT, P. PASQUIER, T. NOWICKI} -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=HackWind7FailleAcrobR7 Attaque Windows 7 par une faille sur acrobat reader 9 via Metasploit]&lt;br /&gt;
# Authentification via fingerprint { Z. CIMINERA, A. HURSTEL, F. VOUILLAMOZ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Autentification_via_fingerprint Autentification via fingerprint]&lt;br /&gt;
# Ransomwares { L. FERREIRA-GOMEZ, S. BERCHERY } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Ransomware Ransomwares]&lt;br /&gt;
# Cryptomonnaie { A. PORCHERON-ROCHE, L. JOMMETTI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Cryptomonnaie Crypto-monnaie]&lt;br /&gt;
# Sécurité des réseaux sans fils WEP, WPA { M. LEBLANC, M.-O. DIALLO } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Securite_des_reseaux_WEP_WPA Sécurité des Réseaux WEP &amp;amp;amp; WPA]&lt;br /&gt;
# le chiffre ADFGVX { M. OUALI-ALAMI, O. SOUISSI } -- [https://lama.univ-savoie.fr/mediawiki/index.php/Le_chiffre_ADFGVX le chiffre ADFGVX]&lt;br /&gt;
# La sécurité de la couche physique du RFID { J. MANGANONI, F. PRISCOGLIO } --[https://lama.univ-savoie.fr/mediawiki/index.php/Attaque_des_supports_sans_contact_type_RFID_et_NFC Sécurité du RFID]&lt;br /&gt;
# Blockchains { A. BADAJ } -- [https://lama.univ-savoie.fr/mediawiki/index.php?title=Blochchain Blockchains]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2016/2017 ==&lt;br /&gt;
&lt;br /&gt;
# Carré de Polybe { C. Farnier, B. Lauret } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php?title=Carre_de_Polybe Carré de Polybe]&lt;br /&gt;
# Cryptographie sur courbe elliptique (ECC) et l&#039;échange de clés Diffie-Hellman sur une courbe elliptique (ECDH) { P. Clavier }&lt;br /&gt;
# Sécurité des réseaux mobiles { G. Charvier, G. Yoccoz } -- [https://lama.univ-savoie.fr/mediawiki/index.php/GSM_Security La sécurité du réseau GSM]&lt;br /&gt;
# Sécurité des fichiers de format commun { A. De-Laere, T. Martin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/S%C3%A9curit%C3%A9_des_fichiers_de_format_commun Sécurité des fichiers de format commun]&lt;br /&gt;
# Sécurité des appareils mobiles { B. Vaudey, B. Toneghin } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Sécurité_appareil_mobile Sécurité des appareils mobiles]&lt;br /&gt;
# Vulnérabilité des réseaux lorawan { H. A. RAKOTOARIVONY, N. Y. P. RANDRIANJATOVO } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Vulnerabilite_du_reseaux_lorawan Vulnerabilite des reseaux lorawan]&lt;br /&gt;
# Injections SQL (SQLi) et méthodes de protection { R. Rebillard, L. Robergeon } -- [https://www.lama.univ-savoie.fr/mediawiki/index.php/Injections_SQL_et_m%C3%A9thodes_de_protection WikiSQLi]&lt;br /&gt;
# Social engineering { A. Senger, J. Manceaux } [https://lama.univ-savoie.fr/mediawiki/index.php/Social_engineering Social engineering]&lt;br /&gt;
# Courbes elliptiques pour la sécurité informatique {J. Suzan, G. Zablocki }&lt;br /&gt;
# Application &amp;quot;textsecure&amp;quot; { F. Ribard, A. Abdelmoumni } -- [https://lama.univ-savoie.fr/mediawiki/index.php/TextSecure WikiTextSecure]&lt;br /&gt;
# Cryptographie Visuelle { N. Baudon, G. Gomila, A. Vincent } -- [http://www.lama.univ-savoie.fr/mediawiki/index.php/Cryptographie_Visuelle Cryptographie visuelle]&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2014/2015 ==&lt;br /&gt;
&lt;br /&gt;
# Cryptologie VS NSA { H. Ramamonjy, N.E. Ould Kadi }&lt;br /&gt;
# le Bitcoin { H. Helbawi, A. Tang, J. }&lt;br /&gt;
# le virus &amp;quot;stuxnet&amp;quot; { N. Challut et T. Chisci }&lt;br /&gt;
# Google Recaptcha { A. SAYAH, A. EL-HARRAS }&lt;br /&gt;
# La cryptographie dans l&#039;antiquité { Y. Lombardi, G. Badin }&lt;br /&gt;
# La sécurité des cartes bancaires { M. Salvat, Y. Salti }&lt;br /&gt;
# Cryptolocker { W. Lecable, M. Genovese }&lt;br /&gt;
# La machine de Turing et ses variantes { C. Laignel, P.E. Roux }&lt;br /&gt;
# La machine ENIGMA { B. Da Silva, G. Ply }&lt;br /&gt;
# La stéganographie { K. Deléglise, Y. Rakotonanahary }&lt;br /&gt;
# Sécurité des cartes bancaires { A. Bigane, F. Way }&lt;br /&gt;
# Le craquage de la cryptographie quantique ? { D. Cauwet, A. Hauguel }&lt;br /&gt;
# Le paiement par NFC { J. Maurice, S. Zehnder }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2013/2014 ==&lt;br /&gt;
&lt;br /&gt;
#* Le cryptosystème Bitcoin { Johanny Clerc-Renaud &amp;amp; Clément Montigny }&lt;br /&gt;
#* La stéganographie { Bosviel Thomas &amp;amp; Tolron Sebastien}&lt;br /&gt;
#* AES { Avet Anthony &amp;amp; Duraz Aurélien }&lt;br /&gt;
#* Payement NFC { Montouchet Raphaël &amp;amp; Marois Jeremy }&lt;br /&gt;
#* La sécurité dans les box de FAI { Charron Thomas &amp;amp; Mesurolle Anthony }&lt;br /&gt;
#* La technologie RFID et la sécurité { CHANTREL Thierry &amp;amp; SEZILLE Aurélien }&lt;br /&gt;
#* Le Cloud et la Cryptologie { Capellaro Alexandre &amp;amp; Chabert Cédric }&lt;br /&gt;
#* La sécurité et les chaines TV cryptées { CINDOLO Giuseppe &amp;amp; NARETTO Benjamin }&lt;br /&gt;
#* Tunneling TCP/IP via SSH {RAHARISON Laurent &amp;amp; JEAN FRANÇOIS Michael}&lt;br /&gt;
#* Principes et techniques de génération de nombres aléatoires {BERTHON Yohann &amp;amp; KELFANI Hugo &amp;amp; REY Anthony}&lt;br /&gt;
#* Sécurité atypique et empreintes des navigateurs {FONTANA Antonin}&lt;br /&gt;
#* La sécurité des monnaies électroniques {BUISSON Valentin &amp;amp; GENY-DUMONT Rémi}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2012/2013 ==&lt;br /&gt;
&lt;br /&gt;
#* Nouvelle philosophie de partage de fichiers avec MEGA { WAYNTAL David et DOMINATI Nicolas } (ok)&lt;br /&gt;
#* La cyberguerre { COLIN François et APPREDERISSE Benjamin } (ok)&lt;br /&gt;
#* Octobre Rouge { REGAZZONI Rudy et LOMBARD Adrien } (ok)&lt;br /&gt;
#* HTTPS et SSL { ASSIER Aymeric et ROLLINGER Claire } (ok)&lt;br /&gt;
#* DMZ { COLLOMB Camille et LAURENT Corantin } (ok)&lt;br /&gt;
#* Failles de sécurité des systèmes informatiques de grandes entreprises (LinkedIn, Apple, Sony, ...) { ARNOULD Mickaël et LEMAIRE Noémie } (ok)&lt;br /&gt;
#* Biométrie { BACART Aurélien et BAH Abdoulaye } (ok)&lt;br /&gt;
#* Sécurité et mobile : nouvelle cible des pirates { GEVET Gwénaël et YANG Yang } (ok)&lt;br /&gt;
#* Sécurité et [http://www.infosafe.fr/Armoirefortedin/Armoirefortedin.htm armoire forte ignifuge] pour les sauvegardes de données&lt;br /&gt;
#* Injections SQL &amp;amp; faille XSS { GUILLOT Pierre &amp;amp; KRATTINGER Thibaut }&lt;br /&gt;
#* La cryptographie militaire { GIUNCHI Ryan &amp;amp; CIMINERA Lary }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2011/2012 ==&lt;br /&gt;
&lt;br /&gt;
A vous de proposer des sujets d&#039;exposés... Prévoir 15min d&#039;exposé, suivi de 5min de questions.&lt;br /&gt;
&lt;br /&gt;
#* La sécurité des cartes bancaires (ok) { DORIEN Christophe et LAPIERRE Rémy }&lt;br /&gt;
#* La cyberguerre (ok) {MAIRE Cyril et MONTCHAL Justine}&lt;br /&gt;
#* La sécurité sur les sites Web (ok) {RABARIJAONA Domoina et BERTHET Vincent}&lt;br /&gt;
#* Virus et antivirus (ok) {EL AZHAR Said}&lt;br /&gt;
#* Présentation et explication de l&#039;attaque par le virus Stuxnet (ok) {PIRAT Victor et MENDES Etienne}&lt;br /&gt;
#* Vulnérabilités des smartphones (ok) {Titouan VAN BELLE et Jean-Baptiste PAUMIER}&lt;br /&gt;
#* L&#039;histoire de la cryptographie (ok) {Costa Jean-Philippe et Morel Julien}&lt;br /&gt;
#* L&#039;Informatique Ambiante et La Sécurité:Quel Protocole? (ok) {Marclin LEON et Farid BOUKHEDDAD}&lt;br /&gt;
#* Systèmes physiques de génération de nombres aléatoires : principes et avantages. (ok) {Florent Carral et Julie Tacheau}&lt;br /&gt;
#* Présentation des Honeypots (ok) {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2010/2011 ==&lt;br /&gt;
&lt;br /&gt;
# Les exposés auront lieu le mercredi 23/3/2011 après-midi, et jeudi 24/3/2011 à partir de 13h30 selon le nb d&#039;exposés. Prévoir 15min d&#039;exposé, suivi de 5min de questions. L&#039;ordre proposé est celui ci-dessous. N&#039;hésitez pas à échanger entre vous.&lt;br /&gt;
&lt;br /&gt;
#* Sécurité des réseaux sans fils (ok) { ZHONG Jie et GONZALEZ Miguel }&lt;br /&gt;
#* La cyberguerre (ok) { SOUBEYRAND Martin et ROBART Laetitia }&lt;br /&gt;
#* Le principe de VPN et les attaques de VPN (ok) { DU Peng }&lt;br /&gt;
#* La signature numérique (ok) { DJEDDI Abdelkader }&lt;br /&gt;
#* Présentation de quelques attaques informatiques et quelques solutions proposées pour y remédier dans les réseaux P2P (ok) { Lila Zane et Ouhemmi }&lt;br /&gt;
#* Sécurité dans les cartes à puce (ok) { LAGHA Youssef et Nodari }&lt;br /&gt;
#* Evolution de la cryptologie à travers les âges (ok, mais vaste !) { DEBAENE Aurélien et VINCENT Christophe }&lt;br /&gt;
#* Biométrie (ok) { ZANE Bania et MENTDAHI Houda }&lt;br /&gt;
#* Comparaison de différents logiciels de crackage (ok) { AMBLARD Mathieu }&lt;br /&gt;
#* Construire des bons mots de passe { Liu Siqi }&lt;br /&gt;
#* La Machine Enigma (ok) { JULLIAN-DESAYES Jeremy et GARDET Nicolas }&lt;br /&gt;
#* Calculateurs quantiques et applications en cryptographie { BORCARD Justine et CATHELIN Gaël }&lt;br /&gt;
#* Présentation des Honeypots {Adiche Rafik et Jean-François Michel-Patrique}&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2009/2010) ==&lt;br /&gt;
&lt;br /&gt;
Les exposés se feront dans l&#039;ordre suivant. Vous pouvez vous mettre d&#039;accord entre vous pour échanger.&lt;br /&gt;
&lt;br /&gt;
# Lundi 14/12 après-midi&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
# Mardi 15/12 après-midi&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONNET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
# Mercredi 16/12 après-midi&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Securité des réseaux sans fils (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2009/2010 ==&lt;br /&gt;
&lt;br /&gt;
#* La virtualisation, facteur de sécurité ou de vulnérabilité (ok) { DIMIER Cédric et CARRIE Antoine }&lt;br /&gt;
#* Comment Aircrack trouve les clés WEP des réseaux wifi (ok) { LANOISELIER Aurélien et MARCHANOFF Jérôme}&lt;br /&gt;
#* Présentation et explication d&#039;une attaque historique (laquelle ?) { FLEUTIAUX Marc et AGUETTAZ Cédric}&lt;br /&gt;
#* La biométrie, une solution miracle pour l&#039;authentification ? (ok) { FERNANDES PIRES Anthony et GAYET Eric}&lt;br /&gt;
#* Stéganographie(ok) { PONCET Johan et MARTIN Romain}&lt;br /&gt;
#* Stéganographie ou les signatures numériques (ok) { TARDY Camille et CASSAGNERES Pierre-André}&lt;br /&gt;
#* Sécurité anti-piratage (ok) {CHEVALIER Daniel et REIGNIER David}&lt;br /&gt;
#* Tour d&#039;horizon des attaques par Injection SQL. (ok) {MILLER Lucas et VIONET Jean}&lt;br /&gt;
#* Tunneling, sécurisation et piratage (ok). {COLLEN Cyril et LAQUA Johann}&lt;br /&gt;
#* Attaques sur SSL. (ok) {Ferlay Mathieu et Six Lancelot}&lt;br /&gt;
#* Le Phreaking, piratage téléphonique (ok) {Rey Myriam}&lt;br /&gt;
#* Fuites de donnée en entreprise (ok) {Tounkara Mounina et Philippe Monteiro}&lt;br /&gt;
#* PGP et la sécurité de l&#039;information {Cyrille Mortier}&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2008/2009 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 30/1 de 8h à 12h (4CANTONS - 64) et de 13h30 à 17h30 (4CANTONS - 65). Les exposés sont à faire par binôme (ou monôme) et doivent durer 20 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés. &lt;br /&gt;
&lt;br /&gt;
#* Les Protocoles de sécurité dans les réseaux WiFi (WEP et WPA) &amp;lt;&amp;lt;&amp;lt;&amp;lt; { Mickaël Wang &amp;amp; Arnaud Villevieille } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/Securite-wifi.pdf PDF]&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison { Anis HADJALI &amp;amp; Vlad VESA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/analyse-securite.pdf PDF]&lt;br /&gt;
#* Google Hacking { Julien ARNOUX &amp;amp; Jeremy DEPOIL } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ghack.pptx PPTX]&lt;br /&gt;
#* Virus et antivirus { Mehdi M. et Christophe M. }&lt;br /&gt;
#* 3DSecure { Natalia Lecoeur &amp;amp; Cindy Chiaberto } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/3D_Secure.pdf PDF]&lt;br /&gt;
#* Sécurité sous Linux en entreprise { Joël Leroy  Ebouele &amp;amp; Barbier Keller }&lt;br /&gt;
#* Techniques et outils de chiffrements de partitions [Valat Sebastien &amp;amp; Bouleis Romain]&lt;br /&gt;
#* IP Spoofing et DNS Spoofing { Alberic Martel &amp;amp; Fabien Dezempte ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2008-2009/ip-dns-spoofing.ppt PPT]&lt;br /&gt;
#* PRA le Plan de Reprise d&#039;Activité {Achraf AMEUR}&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques {Renneville Guybert et Fabrice Noraz}&lt;br /&gt;
#* La gestion des DRM  {Petithory Thomas &amp;amp; Paccard Charléric}&lt;br /&gt;
#* L&#039;introduction SSL,SSH { Julien Roche &amp;amp; Yi Wang }&lt;br /&gt;
&lt;br /&gt;
== Sujets d&#039;exposés pour l&#039;année 2007/2008 ==&lt;br /&gt;
&lt;br /&gt;
Exposés le mardi 26/2 de 8h15 à 11h30 et le mercredi 27/2 de 8h15 à 11h30. Les exposés sont à faire par binôme et doivent durer 25 minutes environ. Ils seront suivis de 5 à 10 minutes de questions. Tout le monde assiste à tous les exposés.&lt;br /&gt;
&lt;br /&gt;
# Sujets d&#039;exposés (propositions, à étoffer)&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Presentation_cryptologie_PAVLOU_DALLA_COSTA_512.mov MOV]&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Cryptologie_et_securite_informatique_-_Fernandes.pdf PDF]&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Les_attaques_mediatisees_-_PIPARO_HUMBERT.pdf PDF]&lt;br /&gt;
#* La mise en place de la sécurité informatique au niveau national et international : CERTs, sites AntiSPAM&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE ) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Expose_securite_sur_le_XSS_-_Roche_et_Serra.pdf PDF]&lt;br /&gt;
#* Virus et antivirus&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, CIMINERA } [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Watermarking_Ciminera_Maeseele.pdf PDF]&lt;br /&gt;
#* La gestion des DRM&lt;br /&gt;
#* Les certificats (PGP, X509) et les infrastructures de gestion de clés &lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* IPsec&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Les outils d&#039;analyse de la sécurité des réseaux : renifleur, scanneurs de ports, outils de détection d&#039;intruison  &lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA} [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/presentation_VIALA_FOLLIET.pdf PDF]&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/OpenBSD_-_Revelin-Errochdi.pdf PDF]&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY) [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO913/Prez-2007/Securite_GPRS_-PEHME_REY.pdf PDF]&lt;br /&gt;
# Planning des exposés Mardi 12/2/2008&lt;br /&gt;
#* Vulnérabilité du protocole A5/1 des mobiles GSM. &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FERNANDES}&lt;br /&gt;
# Mardi 27/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* OpenBSD : aspects sécurité &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (REVELIN et ERROCHDI)&lt;br /&gt;
#* Secure shell (SSH) : protocole, applications, tunnelling &amp;lt;&amp;lt;&amp;lt;&amp;lt; {BODIN}&lt;br /&gt;
#* Sécuriser un réseau : pare-feu, zone démilitarisée, protection des serveurs, adressage local &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; {FOLLIET et VIALA}&lt;br /&gt;
#* Sécurité des réseaux sans fil : authentification, chiffrement, WEP, WPA =&amp;gt;Bugnard/Berthet&lt;br /&gt;
#* Vulnérabilité du protocole WEP et de RC4 pour les réseaux WiFi   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PAVLOU, DALLACOSTA }&lt;br /&gt;
# Planning des exposés Mercredi 28/2/2008, 8h15 -&amp;gt; 11h30&lt;br /&gt;
#* Sécurité GPRS &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; (PEHME et REY)&lt;br /&gt;
#* Les attaques médiatisées sur les systèmes informatiques : Attaque de Mitnick, Morris Worm, DDOS Mafia Boy, etc   &amp;lt;&amp;lt;&amp;lt;&amp;lt; { PIPARO, HUMBERT }&lt;br /&gt;
#* IP Spoofing et DNS Spoofing &amp;lt;&amp;lt;&amp;lt;&amp;lt; { DEMOLIS &amp;amp; JUMEAU )&lt;br /&gt;
#* Attaques par injection de code XSS, parades &amp;lt;&amp;lt;&amp;lt;&amp;lt; { SERRA &amp;amp; ROCHE )&lt;br /&gt;
#* Le tatouage d&#039;image et de document (watermarking) &amp;lt;&amp;lt;&amp;lt;&amp;lt; {MAESEELE, ??? }&lt;/div&gt;</summary>
		<author><name>Petetin</name></author>
	</entry>
</feed>