2012-02-07 5 views
2

J'ai un script de connexion que je viens de commencer. Lorsqu'un nouveau mot de passe est entré, il est d'abord chiffré à l'aide de MD5, puis stocké dans la base de données.Problème avec caractère supplémentaire dans MD5 Hash?

Lorsque je tape le nom d'utilisateur et mot de passe dans mon formulaire de connexion et de le soumettre, je suis en train de vérifier le mot de passe stocké contre une variable $ _POST comme ceci:

$username = $_POST['username']; 
$password = md5($_POST['password']); 
//database stuff here 
$q = mysql_query("SELECT * FROM Users WHERE username='$username'"); 
while ($row = mysql_fetch_array($q)) 
{ 
    if ($row['password'] == $password) 
    { 
     echo "Passwords match."; 
    } 
    else 
    { 
     echo "Password is incorrect."; 
     echo "<br />Entered password: " . $password; 
     echo "<br />Stored password: " . $row['password']; 
    } 
} 

Ceci est juste dans les étapes de test , donc le mot de passe que j'essaie de vérifier est 'mot de passe', pour plus de simplicité. Si je génère $ _POST ['mot de passe'], j'obtiens un mot de passe - cependant, si je génère le hachage MD5 tel qu'il est stocké dans la base de données et md5 ($ _ POST ['mot de passe']), ils ne correspondent pas. Ce dernier a des caractères supplémentaires. quelquun sait pourquoi cela se passe?

+3

1. MD5 est un algorithme très faible, utilisez quelque chose de la famille SHA-2, par exemple. SHA-256. 2. Salt vos mots de passe. 3. Utilisez PDO et les instructions préparées pour la connectivité de la base de données. – Crozin

+0

Merci pour les conseils tout le monde! – Kendra

+1

@Crozin: pendant que vous y êtes, mieux vaut proposer bcrypt ou PBKDF2 avec un nombre élevé d'itérations et de sel par mot de passe au lieu d'un simple hachage et sel ... –

Répondre

0

Malgré les autres réponses, MD5 en tant qu'algorithme ne produit aucun caractère hexadécimal. MD5 est une opération qui est effectuée sur des données binaires. En sortie, il renvoie 16 octets de données binaires.

C'est la fonction PHP qui renvoie une chaîne hexadécimale. Cela dépend de la façon dont vous voulez gérer la sortie du hachage si c'est ce que vous voulez. Si vous enregistrez le hachage sous forme de données binaires, vous voudrez peut-être utiliser la sortie « brute »:

string md5 (string $str [, bool $raw_output = false ])

2

Votre champ est trop court. Les hachages MD5 ont 32 chiffres hexadécimaux.

3

Votre type de colonne peut tronquer les données lorsque vous les stockez.

Vérifiez qu'il y a au moins 32 caractères (la taille d'un hachage MD5).

En outre, ce script est vulnérable à l'injection SQL.

+0

Je réalise que ce script est vulnérable - c'est un essai naissant. En ce moment c'est localhost seulement, ça va être renforcé avant d'aller vivre =) – Kendra

0

Il est possible de se dupé. Cochez cette case:

$str=md5('password'); 
print(strlen($str)); 

et la sortie est 32. (la chaîne est "5f4dcc3b5aa765d61d8327deb882cf99")

Maintenant, essayez d'insérer cela dans le code html:

<?=print(md5('password'));?> 

Et la sortie est "5f4dcc3b5aa765d61d8327deb882cf991" (33 caractères)

Le problème devient plus clair lorsque vous insérez:

<?=print(strlen(md5('password')));?> 

La sortie est "321"

Cela fonctionne:

<?php print(strlen(md5('password')));?>