Cryptage des mots de passe.


Encore trop souvent les mots de passe et pas seulement les mots de passe sont cryptés avec des algorythmes considérés aujourdui comme obsolètes, parce que les bécanes sont beaucoup plus puissantes et les techniques de crackage des mots de passe ont évolué.

Ici le Monsieur du CWE nous recommande :

« Periodically ensure that you aren’t using obsolete cryptography. Some older algorithms, once thought to require a billion years of computing time, can now be broken in days or hours. This includes MD4, MD5, SHA1, DES, and other algorithms that were once regarded as strong. »

http://cwe.mitre.org/data/definitions/327.html

Un super site de sécurité qui fera l’objet d’un billet à lui tout seul.

En effet on rencontre encore trop souvent le MD5

Avec le même mot de passe , il sera plus difficile de casser son équivalent crypté si on utilise un algorythme plus « balaise » que s’il est crypté en MD5.

Celà concerne les OS pour l’ authentification des utilsateurs et de l’admin, mais aussi le PHP sur les sites web..

Pour casser les mots de passe il y a plusieurs méthodes.

1 – Brute force :

Avec deux cas :

1- on essaye de s’authentifier avec des mots du dictionnaire , plus des combinaisons de lettres et de chiffres..

Il y a des chances qu ‘au bout de trois tentatives on se fasse jeter . ou qu ‘on doive attendre 20 minutes avant de recommencer.

2- on essaye la même chose : en entrant des combinaisons de lettres et de chiffres, qu ‘on crypte et on compare le résultat avec le mdp crypté, que l’on a récupéré puisqu ‘il est stocké qq part dans un fichier ou dans une base de données.

2 – Table Arc en Ciel ou Rainbow table :

Cette méthode beaucoup plus sophistiquée va très très vite.

http://fr.wikipedia.org/wiki/Table_arc-en-ciel

http://project-rainbowcrack.com/tutorial_gui.htm

Il faut bien garder à l’esprit, que si nous on ne connait pas les ficelles, naïfs internautes que nous sommes, elles sont publiées sur le net.

Seulement 4 secondes pour cracker le mdp « hello » crypté en MD5

rainbowcrack

Ce n’est pas pour enseigner le piratage , mais pour nous éduquer à la sécurité.

Cependant ça a l’inconvénient de diffuser les techniques, et des pirates en herbe peuvent s’en servir contre nous.. Mais c’est aussi largement diffusé dans l’underground, ça ne change pas grand chose.

http://project-rainbowcrack.com/

On ne va pas expliquer comment utiliser ces tables, personnellement je m’en fous.

Il faut savoir que ça existe

Il faut retenir qu ‘il faut utiliser autre chose que MD5.

Il ne faut pas devenir parano : Il y a beaucoup de buzz autour des rainbows attacks, qui ne piègeront que les non avertis, qui en suivant de mauvais conseils, se contenteront de faire un simple cryptage de leur mot de passe .

Il existe des techniques plus élaborées, qui utilisent les algorythmes de cryptage, pour s’en protéger

( tant qu ‘on lira des bétises comme ça : http://www.mcherifi.org/tag/crack-md5 )

Par exemple pour crypter les mots de passe de son PC , il existe Bcrypt

aussi bien pour Windows, Linux, BSD, Solaris et d’autres OS.

Bcrypt : Blowfish encryption , un des algorythmes de cryptage les plus solides.

On a aucune raison de continuer à crypter ses mots de passe en MD5, installé par défaut.

Disponible ici : http://bcrypt.sourceforge.net/

Sur un site web avec le php :

Tous les exemples sont donnés avec MD5 , idem dans les CMS :

pourtant on en parle sur Wikipédia :

http://fr.wikipedia.org/wiki/MD5

Wikipédia nous indique qu ‘il est préférable d’utiliser SHA256, il y a mieux encore : le SHA 512 et sur SHA ils nous mettent en garde :

En 2005, des doutes sur la résistance de SHA-1 furent émis, à propos de l’éventuelle existante d’une faille mathématique. SHA-2 étant très proche, il pourrait être aussi touché par cette faille.
En conséquence, SHA-3 est en cours de développement. La nouvelle fonction sera sélectionnée via une compétition ouverte lancée entre 2008 et 2012.

On parle aussi du MD5 dans le Monde :

http://www.lemonde.fr/cgi-bin/ACHATS/acheter.cgi?offre=ARCHIVES&type_item=ART_ARCH_30J&objet_id=1064488&clef=ARC-TRK-D_01#xtor=AL-32280184

Extrait : ( 02/01/2009 )

QUAND vous visitez un site Web dont l’adresse commence par « https », un petit cadenas s’affiche. En théorie, cela signifie que le site est sécurisé par un certificat électronique. En pratique, tous les risques sont possibles. Surtout si ce certificat utilise l’algorithme MD5, encore employé par plusieurs autorités de certification des échanges électroniques. Lors d’une réunion de hackers du Chaos Computer Club qui vient de s’achever à Berlin, des résultats présentés mardi 30 décembre ne laissent plus place au doute : cette pièce maîtresse de l’infrastructure Internet n’est pas fiable, et permet à des pirates informatiques de créer des certificats reconnus comme valides par tous les navigateurs courants.

Va falloir se secouer les gars.

Il est urgent de mettre par défaut des algos de hash un peu plus surs et virer définitivement ce MD5 et autres daubes, qui sont reprises dans les CMS

Au fait , je ne sais pas ce qu ‘ils utilisent dans WordPress. hi hi hi. ( pas eu le temps de regarder ).

Attention parce que les distros installent des serveurs LAMP ( Linux Apache MySQL PHP ), qui sont destinés à être utiliser localement, non ouverts sur Internet et qui ne sont pas du tout sécurisés.

Parfois on trouve Apache en root, rarement apache est chrooté et on nos met un tas de fonctions fratiques dans le PHP, qui sont autant de failles de sécurité ,

On va l’utiliser pour mettre au point son site web et après on va l’installer chez l’hébergeur.

MD5 ça va à la maison pour que votre petite soeur ne puisse pas jouer aux admins sur votre site, sur le net MD5 est considéré comme obsolète. pourtant c’est ce qu ‘on trouve le plus dans les CMS.

Tout d’abord il y a deux méthodes distinctes de cryptage :

– le hash :

un algorythme très rapide, une sorte de mixer de cuisine , qui permet de stocker les mots de passe cryptés au moment de l’enregistrement, car si on les sctockait en clair, comme ils sont faciles à trouver dans les divers OS, il n’ y aurait aucune sécurité.

Lors de l’authentification on ne compare pas les mdp en clair, on compare les deux hash obtenus ( le stocké lors de l’enregistrement et celui entré pour s’authentifier ) idem pour les sites web ou le msp des utilisateurs est stocké de façon cryptée dans la base de données

– le chiffrement de données : CYPHER

A la différence du hash on peut chiffrer des données et les déchiffrer avec la bonne clé ; alors que le hash ne se décrypte pas : on peut seulement le craquer ! et donc ça ne convient pas pour récupérer facilement ses données en clair.

Le chiffrement est plus lent que les hash, mais plus difficile à craquer.

Plus lent , c’est relatif , c’est imperceptible pour crypter un mdp, vous n’en être pas à 3/10ème de seconde près pour vous connecter en admin sur votre site.

Par contre le pirate qui voudrait craquer le mdp, ça va drôlement le ralentir, avec le nombre de boucles qu ‘il doit faire.. Blowfish comprend un paramètere temps, qui permet de le ralentir encore.

Pour connaître les algos de hash disponibles dans le PHP du serveur de l’hébergeur il faut faire un script : hash.php

et on se connecte sur son site, sur ce script :

http://www.monsite.fr/hash.php

ou sur le site php: http://www.php.net/manual/en/function.hash-algos.php

Voilà le résultat :

Array ( [0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha256 [5] => sha384 [6] => sha512 [7] => ripemd128 [8] => ripemd160 [9] => ripemd256 [10] => ripemd320 [11] => whirlpool [12] => tiger128,3 [13] => tiger160,3 [14] => tiger192,3 [15] => tiger128,4 [16] => tiger160,4 [17] => tiger192,4 [18] => snefru [19] => gost [20] => adler32 [21] => crc32 [22] => crc32b [23] => haval128,3 [24] => haval160,3 [25] => haval192,3 [26] => haval224,3 [27] => haval256,3 [28] => haval128,4 [29] => haval160,4 [30] => haval192,4 [31] => haval224,4 [32] => haval256,4 [33] => haval128,5 [34] => haval160,5 [35] => haval192,5 [36] => haval224,5 [37] => haval256,5 )

On a toute la collection ( mais ça dépend des distros et de ce que l’hébergeur à mis dans son php )

On ne trouve pas blowfish ! Normal c’est un outil de chiffrement , mais on peut l’utiliser aussi comme « hashoir » :)) ( voir plus loin )

un exemple avec whirlpool :

on veut voir ce que donne un des algos avec le mdp ultrasimple toto on refait un script : toto.php et on s’y connecte.

Ca commence à avoir de la gueule whirlpol donne :

crypto whirlpool :
2662a3c71dbf902fbec15d46139bd6d725991789c570f598743eb2d06ae02e6c79e7187487da2fd5cf69f

Mettre toto en mdp est une très mauvaise idée , même s’il est crypté sur un grand nombre de caractères : il ne résisterait pas deux heures à une attaque par bruteforce.

une des différences de ces hash est le nombre de caratères du mdp, qu ‘ils sont capables de gérer. c’est donc idiot de mettre 4 lettres sur un hash qui a été construit pour gérer 16 caractères ou plus.. Une bonne sécurité est obtenue à partir de douze caractères dans le mdp.

Je n’ai pas l’exemple en MD5 , mais il y a beaucoup moins de caractères à décrypter. C’était juste pour monter qu’il y a en magasin des algos de hash , meilleurs que MD5.

Pour le cryptage ou chiffrement de données ( salut les espions ) :

On veut pouvoir décrypter les données c’est donc du chiffrement de données, dans le PHP il faut utiliser mcrypt :

[q]Mcrypt can be used to encrypt and decrypt using the above mentioned ciphers. If you linked against libmcrypt-2.2.x, the four important mcrypt commands (mcrypt_cfb(), mcrypt_cbc(), mcrypt_ecb(), and mcrypt_ofb()) can operate in both modes which are named MCRYPT_ENCRYPT and MCRYPT_DECRYPT, respectively. [/q]

Mais la c’est pareil on a beaucoup d’ algorythmes dépassés, généralement ceux qu’on cite en exemple. :

* MCRYPT_3DES
* MCRYPT_ARCFOUR_IV (libmcrypt > 2.4.x only)
* MCRYPT_ARCFOUR (libmcrypt > 2.4.x only)
* MCRYPT_BLOWFISH
* MCRYPT_CAST_128
* MCRYPT_CAST_256
* MCRYPT_CRYPT
* MCRYPT_DES
* MCRYPT_DES_COMPAT (libmcrypt 2.2.x only)
* MCRYPT_ENIGMA (libmcrypt > 2.4.x only, alias for MCRYPT_CRYPT)
* MCRYPT_GOST
* MCRYPT_IDEA (non-free)
* MCRYPT_LOKI97 (libmcrypt > 2.4.x only)
* MCRYPT_MARS (libmcrypt > 2.4.x only, non-free)
* MCRYPT_PANAMA (libmcrypt > 2.4.x only)
* MCRYPT_RIJNDAEL_128 (libmcrypt > 2.4.x only)
* MCRYPT_RIJNDAEL_192 (libmcrypt > 2.4.x only)
* MCRYPT_RIJNDAEL_256 (libmcrypt > 2.4.x only)
* MCRYPT_RC2
* MCRYPT_RC4 (libmcrypt 2.2.x only)
* MCRYPT_RC6 (libmcrypt > 2.4.x only)
* MCRYPT_RC6_128 (libmcrypt 2.2.x only)
* MCRYPT_RC6_192 (libmcrypt 2.2.x only)
* MCRYPT_RC6_256 (libmcrypt 2.2.x only)
* MCRYPT_SAFER64
* MCRYPT_SAFER128
* MCRYPT_SAFERPLUS (libmcrypt > 2.4.x only)
* MCRYPT_SERPENT(libmcrypt > 2.4.x only)
* MCRYPT_SERPENT_128 (libmcrypt 2.2.x only)
* MCRYPT_SERPENT_192 (libmcrypt 2.2.x only)
* MCRYPT_SERPENT_256 (libmcrypt 2.2.x only)
* MCRYPT_SKIPJACK (libmcrypt > 2.4.x only)
* MCRYPT_TEAN (libmcrypt 2.2.x only)
* MCRYPT_THREEWAY
* MCRYPT_TRIPLEDES (libmcrypt > 2.4.x only)
* MCRYPT_TWOFISH (for older mcrypt 2.x versions, or mcrypt > 2.4.x )
* MCRYPT_TWOFISH128 (TWOFISHxxx are available in newer 2.x versions, but not in the 2.4.x versions)
* MCRYPT_TWOFISH192
* MCRYPT_TWOFISH256
* MCRYPT_WAKE (libmcrypt > 2.4.x only)
* MCRYPT_XTEA (libmcrypt > 2.4.x only)

Voila ceux que j’ai de valides sur ma distro, dans le php, récupérables avec ce script :

<?php
$algorithms = mcrypt_list_algorithms("/usr/local/lib/libmcrypt");

foreach ($algorithms as $cipher) {
echo "$cipher
\n »;
}
?>

cast-128
gost
rijndael-128
twofish
arcfour
cast-256
loki97
rijndael-192
saferplus
wake
blowfish-compat
des
rijndael-256
serpent
xtea
blowfish
enigma
rc2
tripledes

Les experts nous recommandent de fuire le DES..

Le AES : cest bien , aussi on ne le voit pas sous ce nom il est appellé aussi Rijndael

The Advanced Encryption Standard (AES), also called Rijndael, is a symmetric block-cipher with fixed 128-bit blocks and keysizes of 128, 192, or 256 bits. This algorithm is currently used by the U.S government for both classified and non-classified information

http://www.aescrypt.com/

disponible pour Windows Mac Linux


http://www.aescrypt.com/download.html

Sans hésitation blowfish ( j’ai passe qq heures avant de trouver comment l’utiliser dans php, puisqu’ ils ne donnent que des exemples avec des bouses..) et qu il n’était pas dans la libmcrypt. ( un paquet blowfish à installer. )

Je trouve totalement anormal, que des boites commerciales ( Orange, SNCF etc.. ) ne chiffrent pas ( plus ? ) les données perso de leurs clients ( comme noms et adresses et autres données confidentielles ) dans leurs bases de données , car ca arrive qu ‘ ils se les fassent voler, malgré toutes les précautions prises pour empêcher cela, et qu ils aient des webmasters pro ! Mais ca arrive.

Le cryptage de certaines données est un élément de sécurité complémentaire.

Exemples d’utilisation des fonctions de mcrypt :

http://www.php.net/manual/en/mcrypt.examples.php

et les diverses fonctions sont la :

http://www.php.net/manual/en/ref.mcrypt.php

il y a justement un example avec blowfish, avec d’autres precisions

The Pear class Crypt/Blowfish.php will use the mcrypt module if available but the mcrypt module is not required.

Some very easy Pear and example pseudocode to protect your data by encrypting your databases with a one-way hash and blowfish symmetric encryption.

http://en.wikibooks.org/wiki/Cryptography/Database_protection

Using a one-way hash and blowfish symmetric encryption.
1. Insert a record of John Doe in an encrypted database.
2. Get the encrypted record of user John Doe and decrypt the data.

1. Insert a record of John Doe in an encrypted database.
setKey( $cipher_key );

// crypt_blowfish symmetric encryption to encrypt the data
$aRecord[’email’] = $bf->encrypt( $aRecord[’email’] );
$aRecord[‘name’] = $bf->encrypt( $aRecord[‘name’] );
$aRecord[‘creditnr’] = $bf->encrypt( $aRecord[‘creditnr’] );

$result = sqlInsert( $aRecord ) ;
?>

Le lien qui est donné fait un peu le tour du sujet :

Evidement ,il faut une clé secrète , sinon tout le monde crypterait de la mëme facon.

Blowfish est utilise dans phpmyadmin ( administration par le web de la base de données MySQL ) dont la securite du mdp d’authentification est primordiale :

/var/lib/phpmyadmin/blowfish_secret.inc.php
/var/phpmyadmin/libraries/blowfish.php

( la clé secrète, qui doit etre utilisée comme on utilise un grain de sel, génerée a l’install /var/lib/phpmyadmin/blowfish_secret.inc.php, étant beaucoup plus longue aussi : 25 caracteres.. ).

Le paquet Crypt_Blowfish-1.1.0RC2, ( avec des scripts php ), montre plusieurs « acces » :

CRYPT_BLOWFISH_AUTO

CRYPT_BLOWFISH_MCRYPT

CRYPT_BLOWFISH_PHP

Blowfish aussi peut etre utilise pour faire du hash de mdp ou du chiffrement de donnees.

Modes de chiffrement :

Il existe quatre modes de chiffrement par bloc :

Electronic CodeBook (ECB),

Cipher Block Chaining (CBC), recommandé

Cipher FeedBack (CFB)

Output FeedBack (OFB).

Tout est explique en detail ici : http://www.securiteinfo.com/cryptograph … ique.shtml

On peut y lire que le mode EBC est obsolète et OFB purement et simplement déconseillé..

Ils recommandent CBC.

Ces modes de chiffrement , sont plus ou moins associes au type de cypher utilise pour le chiffrement.

Blowfish permet d’utiliser EBC et CBC

sh-3.2$ ls
CBC.php
ECB.php
PHP.php
DefaultKey.php
MCrypt.php

J’oubliais de mettre mon grain de sel 🙂

Utilisation de SEL ou SALT pour le HASH :

C’est intéressant d’avoir le même algo de hash : par exemple lorsqu ‘on veut vérifier que le contenu d’un fichier downloadé, donne bien le même MD5 que celui du miroir où on le télécharge.

Mais le même mot de passe donnera le même résultat chez vous que chez moi, comme chez un pirate, qui a temps perdu se constituera un fichier de crack de MD5 ou autre

Il y en en a qui sont assez cons pour le faire :)))

Sur un site de cracks, j’ai vu un type qui en voulait à la planète entière et qui, a temps perdu, se faisait une liste de cracks de MD5. Ca l’occupe, surtout son PC, mais le pauvre n’a rien compris.

Pour compliquer le travail des pirates, sur un site web dans le php on peut ajouter un grain de sel au hash, qu ‘on est le seul à connaître, pour crypter le mdp de ses clients.

Ainsi en utilisant le même algo de hash, le mdp « HT34xDs13b » crypté, chez moi avec un grain de sel « Brk1764FgLo84Cx32 » ne donnera pas le même résultat crypté, si vous le cryptez avec un autre grain de sel ( salt ) « Allo_Zezette_g_perdu_les_cles_du_camion  »

Ca complique le craquage du mdp crypté ( encore un exemple avec MD5 … put….)

http://php.net/manual/en/function.md5.php

$hash = sha512 ($pass . $salt);

Le salt peut être le hash d’une chaine de caractères :

$salt = sha512(« allo_tonton_pourquoi_tu_tousses »);

Mais on combine généralement des systèmes aléatoires pour ne pas retomber dans les limites des carctères.

voir en bas de page .. PKS Bcrypt

Un salt trop simple est l’inconnue à trouver lorsque le pirate a réussi à voler un couple utilisateur mot de passe. Il s’en servira pour cracker les autres mdp.

On peut combiner plusieurs salts ( sel et poivre 🙂 )

$hash = sha512 ($pass . $salt1 . $salt2)

En tant qu ‘admin d’un site, ( si on a une IP fixe ) un salt pour générer le mdp stocké peut être notre IP : $salt2=$_SERVER[‘REMOTE_ADDR’] , et idem dans le script de connection

Ainsi qqun qui nous piquerait notre mdp ( écrit en gros sur un post-it scotché sur l’écran ) ne pourra pas se connecter de chez lui : car il aura une autre IP, donc pour le serveur un autre salt, et donc ça ne donnera pas le même résultat de hash du même mdp.

Avec une IP mobile , on ne peut prendre que la partie fixe de la plage d’IP de son FAI, ça limite toujours les dégats.

Avec un portable , l’IP peut changer.. mais il y a des solutions pour identifier la bécane avec un système de cookies et s’en servir dans le salt, combiné avec le mot de passe.

On peut compliquer à loisir avec un systéme de cookie : on peut intégrer dans les salts de cryptage du mot de passe qqchose qui dépend de la machine émettrice . Si c’est un portable , l’ IP peut changer..

Exemple le $USER_AGENT qui comprend l’OS du connecté, sa version , son navigateur, sa version.

On peut le modifier ( pas souhaitable pour le fonctionnement du site )

ou le compléter avec une clé pour vraiment le personnaliser.

Pour firefox ca se passe dans about:config ( chercher la chaine : agent )

Chaque fois qu ‘on intègre un paramètre dans l’élaboration d’un SALT, on fait une forme d’identification complémentaire au mot de passe, pour se protéger du vol de mot de passe .

Un site pour tous les essayer avec ou sans SALT:

http://www.sinfocol.org/herramientas/hashes.php

http://www.mieuxcoder.com/2007/12/23/mettez-du-sel-dans-vos-mots-de-passe/

Le site officiel de PHP sur la fonction crypt avec les divers hash :

http://www.php.net/manual/en/function.crypt.php

Site web cookies et sessions :

Sur les sites web les sessions sont un système destiné à vérifier que c’est bien le même connecté que celui qui s’est authentifié, depuis la connection ( identification ) jusqu ‘à la déconnection ( un sujet assez complexe qui ne peut er abordé ici.) simplement dans les cookies et dans les sessions on utilise le cryptage et les hash, avec des salt.

Suoshin un complément de sécurisation du PHP nous en parle :

http://www.hardened-php.net/about_us.11.html

Pour les IP mobiles, Susoshin propose de ne prendre qu’ un certain nombre d’octets, configurable ( de 0 à 4 ), selon la plage d’IP du FAI, et pas mal d’options pour les divers elements a crypter, désactivées par défault., mais apparemment il a l’air de pouvoir faire ce boulot lui même.. au lieu de le faire soi même dans les scripts, mais si l’hebergeur n’a pas mis suoshin , ou s’il a oublié de le configurer.

suhosin.session.cryptraddr

*
Type: Integer
*
Default: 0

Number of octets (0-4) from the REMOTE_ADDR that the transparent session encryption key depends on. Keep in mind that this should not be used on sites that have visitors from big ISPs, because their IP address often changes during a session. But this feature might be interesting for admin interfaces or intranets. When used wisely this is a transparent protection against session hijacking/fixation.

suhosin.session.checkraddr

*
Type: Integer
*
Default: 0

Number of octets (0-4) from the REMOTE_ADDR that have to match to decrypt the session. The difference to suhosin.session.cryptaddr is, that the IP is not part of the encryption key, so that the same session can be used for different areas with different protection levels on the site.

suhosin.cookie.encrypt

*
Type: Boolean
*
Default: On

Flag that decides if the transparent cookie encryption is activated or not.

suhosin.cookie.cryptkey

*
Type: String
*
Default:

Cookies can be encrypted transparently. The encryption key used consists of this user defined string and optionally the User-Agent, the Document-Root and 0-4 Octects of the REMOTE_ADDR.

suhosin.cookie.cryptua

*
Type: Boolean
*
Default: On

Flag that decides if the transparent session encryption key depends on the User-Agent field. (When activated this feature transparently adds a little bit protection against session fixation/hijacking attacks (if only session cookies are allowed))

Connection HTTPS :

Une connection https est sécurisée car elle est cryptée.

Elle utilise Open SSL et ça marche avec des certificats.

Un billet sera consacré à Open SSL et au problème des certificats

Pour le choix du système de cryptage des clés ou du contenu ça se passe avec une négociation entre le serveur et le poste de l’internaute.

Tous les OS et toutes les machine n’ayant pas les mêmes cyphers. Tous les serveurs n’ont pas les mêmes cyphers..

Il est évident qu’une liaison https cryptée en MD5 qui envoye les identifications de connection à un site web sera plus facile à décrypter , qu ‘une liaison utilisant un chiffrage plus performant.

Si on fait un site web avec une connection https , il faudra s’y intéresser

Une commande permet de lister les cyphers disponibles dans un OS.

:~$ openssl ciphers -v
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
DES-CBC3-MD5 SSLv2 Kx=RSA Au=RSA Enc=3DES(168) Mac=MD5
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
RC2-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC2(128) Mac=MD5
RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1
RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
RC4-MD5 SSLv2 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH Au=RSA Enc=DES(56) Mac=SHA1
EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH Au=DSS Enc=DES(56) Mac=SHA1
DES-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=DES(56) Mac=SHA1
DES-CBC-MD5 SSLv2 Kx=RSA Au=RSA Enc=DES(56) Mac=MD5
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export
EXP-DES-CBC-SHA SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export

Voir l’article du Monde :

http://www.lemonde.fr/cgi-bin/ACHATS/acheter.cgi?offre=ARCHIVES&type_item=ART_ARCH_30J&objet_id=1064488&clef=ARC-TRK-D_01#xtor=AL-32280184

Toutefois le MD5 qui est un hash et non un cypher , n’est pas utilisé pour crypter le contenu, puis qu’ un hash n’est pas déchiffrable, mais il intervient dans les clés échangées entre le serveur et l’internaute.

Autres considérations sur les mots de passe :

On a dit qu ‘il ne fallait pas stocker les mdp en clair, pour des raisons de sécurité :

Le monsieur du CWE nous le dit aussi

http://cwe.mitre.org/data/definitions/312.html

Voilà ce qui est fait dans la plupart des CMS pour la connection php à la base de données pour voir ce qu il ne faut pas faire et tout le monde sait ou les trouver dans les fichiers de configuration ( car tout le monde peut télécharger le CMS pour l’ étudier )

define(‘DB_SERVER’, ‘localhost’);
define(‘DB_SERVER_USERNAME’, ‘epicier‘);
define(‘DB_SERVER_PASSWORD’, ‘epicier‘);
define(‘DB_DATABASE’, ‘oscommerce‘);

exemple pour un test , à ne pas suivre pour les mdp, mais me s’il est à rallonge, il n’est pas crypté et peut être volé .

<?php
if (!defined('DBSECURE'))
{
$sql_host = "localhost"; //Adresse serveur MySQL – MySQL server address
$sql_login = "machin"; //Login
$sql_pass = "truc"; //Mot de passe – Password
$sql_base = "phpboost"; //Nom de la base de donnes – Database name
define('PREFIX' , 'phpboost_'); //Prfixe des tables – Tables prefix
define('DBSECURE', true);
define('PHPBOOST_INSTALLED', true);

ou dans les requetes.:lol: lol

<?php

$dbh = new PDO('mysql:host=localhost;dbname=mydb', 'mydbuser', 'nDUdfyE29k4rpPXV');

Pourquoi est ce fait comme ça ?

Réponse de Madame Lapalisse, parce qu ‘on ne peut pas faire autrement ( sur un hébergement mutualisé.)

Il faut cacher ses mots de passe et authentifiants de connection.
mais attention : l’obscurantisme n’est pas de la sécurité.
On le fait avec les permissions sur les fichiers.

Par exemple dans Linux les mdp des users sont dans un fichier : /etc/shadow, qui appartient au user shadow et au groupe shadow.

Seul le user root et un programme ou un script qui tournerait sous le user shadow pourrrait les lire, et le chmod serait rwx rwx — personne d’autre ne peut les lire ou même y accéder.

Hélas tous les scripts php tournent avec le user d’apache : www ( quand ce n’est pas root !!! une vraie catastrophe, mais ça existe sur certaines distros )

Le chroot d’ Apache, bloque le serveur dans un répertoire /var/www, et il faudrait stocker ces données de connection aux bases de données ailleurs. Le chroot empêchera d’aller les chercher ailleurs, avec les fichiers de conf dans /etc/Apache2 par exemple.

Cependant sur un serveur dédié, on a plus de possibilités, pour cacher ces données de connection.

La protection de la base de données est essentielle, or elle est insuffisante avec la plupart des CMS ( les injections SQL sont une des vulnérabilités les plus souvent rencontrées. C’est un autre sujet, mais il n’y a pas que cette technique, le vol des données d’authentification et des mots de passe en est une. )

Je consacrerais un billet sur la protection de la base de données, car j’ai pas mal cogité sur le sujet.

Forcément on se fait houspiller dès qu’ on dit que ce qui existe n’est pas fiable, mais je m’en fous de ce qu ‘ils font pour les sites web.

Ce n’est pas parce qu’ on a toujours fait comme ça, qu ‘il ne faut pas le remettre en cause.

Je viens du domaine de l’info indus, on utilise aussi des bases de données , avec des applis intranet qui utilisent ces données, aussi c’est parfaitement sécurisé..

On ne peut pas downloader les scripts PHP, ni les .htacces et .htpasswd ????

Ah bon !

Un exemple :

ici on utilise ( dans son réseau local sur son propre serveur en test , avec une install standard ) un microbackdoor k.php, de 29 caractères, injecté par les techniques de LFI ( load file injection ) ou RFI ( remotefile injection ) injecté dans la /tmp, et qui permet grace à une fonction du PHP de passer des commandes shell, comme si on était en console sur le serveur.

Fonction qui n’aurait jamais due être activée, mais ce n’est pas la seule.

sh-3.2$ curl http://myserver.home/tmp/k.php?f=cat%20&#8230;. … configure.php

Il suffirait d’envoyer un script php avec ces parmètres d’authentification, pour lire tout le contenu de la base. Ensuite on pourra revenir périodiquement inspecter la base..

Démo avec les .htacces et .htpasswd qui étaient vides lors de ce test, avec la commande cat

sh-3.2$ curl http://myserver.home/tmp/k.php?f=cat%20 … /.htaccess
voila le contenu du htaccess

sh-3.2$ curl http://myserver.home/tmp/k.php?f=cat%20 … /.hypasswd
voila le contenu du htpasswd

dans cet exemple , ils sont vides, sinon on aurait trouvé les mdp cryptés et les noms d’utilsateurs, autorisés a franchir le htacces.

Il ne reste plus qu ‘à casser le hash du mdp, ce sera facile s’il est en MD5 et sans SALT , et on se retrouve admin du site.

Si pour lors de l’authentification, dans le SALT on prend, en plus d’un salt à rallonge, des octets de l’IP de celui qui se connecte, différents de ceux de l’admin jamais ça ne marchera..avec le mdp que le pirate aura essayé de décoder, même s’il le trouvait..

Ce n’est pas parfait , il peut faire du spoofing d’ IP. mais normalement on doit se protéger du spoofing.

Outils de cryptage de mots de passe

Il faut savoir que se sont développés de véritables usines de cryptage de mots de passe autour des algos conventionnels de hash ou de blowfish., utilisant des salt et faisant de nombreux tours de cryptage et capables de résister aux rainbows attaques.

Plutot que d’inventer son propre système il est plus sur d’utiliser ceux qui ont été bien étudiés, comme Bcrypt..

http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

FreeBSD : PHK sur MD5

OpenBSD : Bcrypt sur Blowfish

extrait du man de bcrypt qui peut fonctionner aussi d’autres algos de hash que blowfish

Blowfish crypt
The Blowfish version of crypt has 128 bits of salt in order to make
building dictionaries of common passwords space consuming. The initial
state of the Blowfish cipher is expanded using the salt and the password
repeating the process a variable number of rounds, which is encoded in
the password string. The maximum password length is 72. The final
Blowfish password entry is created by encrypting the string

« OrpheanBeholderScryDoubt »

with the Blowfish state 64 times.

The version number, the logarithm of the number of rounds and the
concatenation of salt and hashed password are separated by the `$’
character. An encoded `8′ would specify 256 rounds. A valid Blowfish
password looks like this:

« $2a$12$eIAq8PR8sIUnJ1HaohxX2O9x9Qlm2vK97LJ5dsXdmB.eXF42qjchC ».

The whole Blowfish password string is passed as setting for
interpretation.

SRP : Stanford Secure Remote Password protocol

qui est une alternative intéressante aux connections typs SSL avec des cerificats, qui coutent très cher auprès des autorités qui les garantissent, comme Verisign, car un certificat maison n’ inspire pas toujours confiance aux internautes

http://www.xorax.info/blog/news/111-secure-remote-password-protocol-srp.html

J’ai trouvé aussi ce système aussi qui donnera pour chaque user un mdp et un salt différent , en prenant le temps comme valeur aléatoire :

un salt différent par user enregistré dans une base de données, compliquerait la tache au cas où le pirate découvrirait le salt, s’il était commun à tous les users.

( enfin un exemple qui n’est pas en MD5 )

<?php
$str = "hello world";

$salt1 = hash('sha256‘,microtime(). »this is a simple but still hard to guess salt »);
$time1 = microtime(1);
$user1 = crypt($str,’$2a$10$’.$salt1.’$’);
$time2 = microtime(1);

echo $str. »
« ;
echo « 
user1: « .$user1. »
salt: « .$salt1. »
« ;
echo « 
diff: « .($time2-$time1). »
« ;

echo « egal ? « .(crypt($str,$user1)==$user1). »

« ;

$salt2 = hash(‘sha256‘,microtime(). »this is a simple but still hard to guess salt »);
$time1 = microtime(1);
$user2 = crypt($str,’$2a$10$’.$salt2.’$’);
$time2 = microtime(1);

echo « 
user2: « .$user2. »
salt: « .$salt2. »
« ;
echo « 
diff: « .($time2-$time1). »
« ;

echo « egal ? « .(crypt($str,$user2)==$user2);
?>

qui donne :

hello world

user1: $2a$10$eddc466a2e5c360daa86auThhtJUkyexEUwkk3PANuTWgp/UrhuCS
salt: eddc466a2e5c360daa86a9ab656f1cb3a028f86c39927eb7c47003c8cf417026

diff: 0.090398073196411
egal ? 1

user2: $2a$10$93dfd9d62ea4617a7af62uViXNslwmQTnU9wDlC.dfXnXQ6GJbPXW
salt: 93dfd9d62ea4617a7af627e319fa848eca82a1465b6a50d540c2ad206f5942fe

diff: 0.089483976364136
egal ? 1

On en parle ici :

http://www.developpez.net/forums/d871312/club-professionnels-informatique/actualites/stocker-passe-toute-securite-bcrypt-bonne-methode/

Et tête des mdp cryptés on trouve des variables comme $1, c’est un code correspondant au système de hash utilisé.

Allez, bons crypts 😉

Et bien voilà encore un exemple comme quoi les professionnels continuent à faire des erreurs de débutants :

http://www.zdnet.fr/actualites/mathieu-cunche-inria-la-faille-de-securite-de-linkedin-est-impardonnable-39772686.htm#xtor=EPR-105

Publicités
Cet article a été publié dans Cryptage. Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s