Jump to content
Invision Board France
Sign in to follow this  
Jazzbop

[IPB 1.3.1 Final] Cryptage des mots de passe

Recommended Posts

Jazzbop

Bonjour,

voila j'ai eu pour idée simple de mettre au point sur mon site un espace membre avec authentification (login et password) qui serait basé sur les identifiants du visiteur choisis lors de son inscription sur mes forums.

 

J'ai donc voulu mettre au point un petit script en php qui se connecte sur ma base de donnée, puis qui aille chercher dans la table ibf_members le login et mot de passe de l'utilisateur qui souhaite s'identifier par le biais d'un formulaire.

En testant mon script je me suis rendu compte que bien entendu (et j'aurais dû y penser!) les mots de passe etaient cryptés avant d'être enregistrés dans la base de donnée.

 

Je voudrais donc pouvoir facilement résoudre mon problème pour que la zone membre du visiteur soit accessible avec son même mot de passe IPB qu'il taperait pour se connecter sur les forums...

Pouvez-vous m'aider et m'apporter une solution? Car je ne suis pas expert et je ne voudrais pas trop fouiner dans les sources IPB sans être sûr...

La seule solution est-elle de trouver le bout de code qui met en place l'algorithme de cryptage des mots de passe pour le recopier tel quel dans mon script afin qu'il s'éxecute et décrypte le mot de passe à l'envoi du formulaire d'identification?

Si oui, merci de me donner plus de détails (où se trouve la portion de code qui m'intéresse, dans quel fichier, comment la mettre en place,...).

 

 

Je pense que c'est un sujet intéressant qui mériterait d'être abordé ici, car il pourrait intéresser un grand nombre de webmasters.

 

Merci.

Edited by Jazzbop

Share this post


Link to post
Share on other sites
Prolag

pour l'algorithme de cryptage des mots de passe

je le connais pas mais je sais que ca utilise une fonction :)

Md5

et pour faire ce que tu veux

tu recupere le mot de passe de ton membre

tu le crypt

$crypt_mdp = md($motdepass);

et tu fais la meme requete que d'hab de quand tu n'a pas un mot de passe crypté :)

 

ou sinan tu utilise le SDK dispo sur Invisionize ;)

Edited by Prolag

Share this post


Link to post
Share on other sites
Jazzbop

tu veux dire:

$encrypted_pass = md5($password);

 

Non?

Je vais tester...

Share this post


Link to post
Share on other sites
Prolag
tu veux dire:

$encrypted_pass = md5($password); 

 

Non?

Je vais tester...

Oui md5

et non md ;):P

Share this post


Link to post
Share on other sites
dash

Tant que nous sommes dans la Base de Connaissance...

 

pour pouvoir reutiliser les login/mots de passe a l'exterieur d'IPB, il existe des solutions (plus ou moins) pretes a l'emploi :

LoginFromAnyWhere, IPB SDK, etc. (disponibles sur invisionize.com et ipbr-fr.com)

 

Vous pouvez aussi coder vous meme votre propre module.

Les mots de passe sont codes sur 32 bits avec une fonction de "hashage", non-bijective, cad non-reversible.

 

Voir informations : http://www.php.net/manual/fr/function.md5.php

 

Mathematiquement, la relation non-bijectique peut s'illustrer comme suit :

ibf_members['password']= MD5($password);

mais il n'existe pas de fonction inverse MD5^-1() telle que $password=MD5^-1(ibf_members['password']), ou si elle existe, elle n'aurait rien de trivial.

 

Ce qui est crypte pouvant etre decrypter. MD5 n'est pas une fonction de cryptage mais de "hashage".

Ce qui signifie que MD5 est une injective : il est impossible de 'decrypter' le resultat.

 

Une fois le md5 d'une chaine calcule, il est statistiquement impossible de retrouver identiquement la chaine d'origine.

la seule possibilite pour verifier si une chaine x2 correspond bien a x, est de realiser un test :

si MD5($mot_de_passe) == $ibf_members['password'];

alors $mot_de_passe est equivalent au mot de passe de l'utilisateur 

(sans forcement etre exactement avoir la meme valeur que ce mot de passe)

 

Au mieux, les applications de bruteforce pourraient trouver par comparaison un "equivalent" qui produirait le meme resultat. Mais pour obtenir des chaines equivalentes, ces scripts doivent mouliner des heures/jours/semaines entieres, pour essayer des combinaisons (tout l'interet de choisir des mots de passe longs, composes d'un melange de chiffres, de lettres et autres symboles et d'en changer periodiquement).

 

Voici un pur exemple :

le resultat MD5 d'une donne de 700Mb est "6e0ecca5d53bb24aeb889ae463b52b4c"

Pourrez-vous jamais "decrypter" le contenu du fichier d'origine ?

 

 

Dans IPB 2.0, on retrouve meme des codages encore plus tordus :

 

md5( md5( $member['converge_pass_salt']) . md5($in_pass) )

md5($ibforums->member['email'].'&'.$ibforums->member['member_login_key'].'&'.$ibforums->member['joined']);

De quoi, en principe, augmenter le niveau de securite d'IPB.

Pour ceux qui n'ont peur de rien, regardez la fonction stats::get_md5_check(). ;)

Share this post


Link to post
Share on other sites
Jazzbop

merci pour ces précisions...

on voit qu'il y'a un matheux dans l'air ;)

heureusement que je fais des études scientifiques parce que les termes d'injectivité, surjectivité ou bijection réciproque, ca ne doit pas parler à tout le monde :P

 

A +

Share this post


Link to post
Share on other sites
Prolag

Vi c'est un peu des Maths...

 

Dash pour la recevibilité le md5 est comme le RSA ?

c'est une fonction super lent a inversé (modulo d'exp....)

 

De quoi, en principe, augmenter le niveau de securite d'IPB.

Pour ceux qui n'ont peur de rien, regardez la fonction stats::get_md5_check(). sweatingbullets.gif

Yep j'avais ecris un truc sur la facon donc c'est gerer sur le IBP2.0

il faudrais faire un post bilan....

la seule chose qui manque à IPB2.0

c'est un changement automatique de member_login_key car c'est toujours la meme...

apres ca

pour cracker le bordel ca sera tres dur....

Share this post


Link to post
Share on other sites
dash

Je n'ai pas de benchmark sous la main, mais a priori, il me semble que si le cout d'une appel MD5 est negligeable, ca n'est pas nul pour autant.

 

Si un programme a besoin de X cycles pour traiter un MD5, le fait qu'IPB 2.0 enchaines les MD, devrait entrainer une multiplication des couts.

 

Pour la grande lenteur d'inversion : oui et heureusement.

 

S'il existait une technique (non-triviale) pour inverser un quelconque resultat MD5, sachant que n'importe quel chaine produit 32 caracteres, il y aurait matiere a faire fortune (compresser l'entierete d'un DVD, voire de tous les DVD du monde, sur 32 caracteres, par exemple !) et meme a prix Nobel (sauvegarde de la connaissance universelle sur 32 caracteres). ;)

 

Et conclusion, et pour ceux que ce sujet interesse, je dirai que ... a4e2cca5deca0b695398c02ap54spx0h :P

Share this post


Link to post
Share on other sites
Jazzbop

Ouais donc faites un topic épinglé la dessus pour regrouper toutes les infos que vous aurez récoltées!

Encore merci.

Edited by Jazzbop

Share this post


Link to post
Share on other sites
b!o]-[aZaRd

Bonjour,

Je suis possesseur d'un Invision Power Board v2.0.0, j'ai un espace membre sur mon site est j'aimerai que les identifiants du forums marchent pour celle-ci. Je n'ai pas bien compris les explications de Dash, j'aimerai savoir quelles sont les lignes de codes à insérée dans le script pour que cela marche parce que j'ai essayer le md5(); mais cela ne marche pas. Quelqu'un serait comment faire pour que les mots de passes et me l'expliquer ou me donner un bout de script ?

Share this post


Link to post
Share on other sites
dash

je n'ai qu'un conseil a vous donner : utilisez IPBSDK.

Ou allez voir sur invisionize.com. Il existe la-bas differents scripts dans les sections Website Integration.

 

tiens, ca fait 2 conseils pour le prix d'un...

Share this post


Link to post
Share on other sites
Guest Red Devils

Voila moi j'ai utilisé le IPBSDK, c'est complexe a mettre dans son site mais c'est faisable :)

 

Preuve d'aileurs sur www.mufc-france.com

Edited by Red Devils

Share this post


Link to post
Share on other sites
Squallynou

Bonjour :D

 

 

Pour ceux qui comme moi ne veulent pas utiliser de gros mods juste pour une simple identification, voici une fonction qui permet de vérifier si un user à bien saisi son pass :

 

function md_ipb( $givenpass, $salt, $realpass)
{
if ( !$realpass )
{
 return FALSE;
}

if ( $realpass == md5( md5( $salt ) . md5($givenpass) ))
{
 return TRUE;
}
else
{
 return FALSE;
}
}

 

les parametres :

$givenpass est le pass saisi par l'user qui veut se loguer

$salt est le "converge_pass_salt" de l'user

$realpass est le "converge_pass_hash" de l'user.

 

Donc il vous suffit de faire une requete SQL qui va chercher le pass_salt et le pass_hash de l'user, puis vous mélangez dans la fonction avec le pass saisi dans le formulaire et vous en sortie un boolean qui est à TRUE si l'user à saisi le bon pass et False dans le cas contraire. Voili voilou, si ça peut en aider quelques uns :D

 

 

Ah oui et une petite page toute bete mais utile si vous voulez changer le pass d'un user directement dans la base de donné sans passer par le forum :

http://sims-dream.com/annexe/pages/convertisseur.php

voilà, le simple c'est pour un forum PHPBB et l'autre pour l'IPB. Si vous préférez passer par la base de donnée je vous conseil de créer une page similaire c'est pratique :).

Edited by Squallynou

Share this post


Link to post
Share on other sites
kayak

bonjour,

 

Quelqu'un a t-il de meilleur explications car je n'ai pas compris,

j'ai ça :

<?php 
include("config.php");

$base = mysql_connect ($host, $loginbase, $mdpbase);
mysql_select_db($bdd, $base);// pensez a mettre vos données

if(isset($_POST) && !empty($_POST['pseudo']) && !empty($_POST['pass'])) 
{ extract($_POST);
 $pseudo = htmlentities($_POST['pseudo']);
 $givenpass = htmlentities($_POST['pass']);

 $sql23 = "SELECT * FROM scoot_members WHERE name='".$pseudo."'";
 $req23 = mysql_query($sql23) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
 $id = $req23['id'];
 $sql2 = "SELECT * FROM scoot_members_converge WHERE converge_id='".$id."'";
$req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

$salt = $req2['converge_pass_salt'];
$realpass = $req2['converge_pass_hash'];

function md_ipb( $givenpass, $salt, $realpass)
{
if ( !$realpass )
{
?>
erreur mot de passe
<?php
}

if ( $realpass == md5( md5( $salt ) . md5($givenpass) ))
{
session_start();
$_SESSION['pseudo'] = $pseudo;

echo 'Vous êtes bien logué <br /> <a class="a_menu" href="membres.php">
Cliquez ici</a> si la redirection ne marche pas.';
echo "<meta http-equiv=\"Refresh\" content=\"1;URL=membres.php\">";
}
else
{
?>
<form method="post" action="">
Pseudo :  <input name="pseudo" type="text" size="15" /><br />
Mot de Passe : <input name="pass" type="password" size="15" />
<br />
<input type="submit" name="Submit" value="Valider" />
<br /></form>
<?php
}
}
}
else {
?>
<form method="post" action="">
Pseudo :  <input name="pseudo" type="text" size="15" /><br />
Mot de Passe : <input name="pass" type="password" size="15" />
<br />
<input type="submit" name="Submit" value="Valider" />
<br /></form>
<?php
}
?>

 

mais le code ne retourne rien :)

Share this post


Link to post
Share on other sites
Erwin

Bonsoir,

 

D'où provient ce code ?

Share this post


Link to post
Share on other sites
kayak

c'est moi qui l'ai codé.

D'ailleur je l'ai mis à jour :

if(isset($_POST['login']) AND isset($_POST['password']))
{
$login = htmlentities($_POST['login']);
$password = htmlentities($_POST['password']);

function test_pass($login,$password)
{
$sql = mysql_query("SELECT * FROM scoot_members WHERE name='$login'");
			if (mysql_num_rows($sql) == 1)
			{
			$sql = mysql_fetch_array($sql) or die (mysql_error());
			$id=$sql['id'];

			$sql = mysql_query("SELECT * FROM scoot_members_converge WHERE  converge_id='$id'") or die (mysql_error());
			$sql2 = mysql_fetch_array($sql);



				if(md5(md5($sql2['converge_pass_salt']).$password)==$sql2['converge_pass_hash'])
				{
				return 1;
				}
				else
				{
				return 0;
				}
			}
			else
			{
			return 0;
			}
}

if(test_pass($login,$password)==1)
{
session_start();
$_SESSION['pseudo'] = $pseudo;

echo 'Vous êtes bien logué <br /> <a class="a_menu" href="membres.php">
Cliquez ici</a> si la redirection ne marche pas.';
echo "<meta http-equiv=\"Refresh\" content=\"1;URL=membres.php\">";
}
else {
echo 'erreur de mot de passe';
echo "<meta http-equiv=\"Refresh\" content=\"1;URL=connexion.php\">";
}
}
else {
echo 'erreur de mot de passe2';
echo "<meta http-equiv=\"Refresh\" content=\"1;URL=connexion.php\">";
}
?>

mais ça ne marche toujours pas :/

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.