À quel point est-ce plus sûr que le MD5 ordinaire ? Je viens de commencer à me pencher sur la sécurité des mots de passe. Je suis assez nouveau en PHP.
$salt = 'csdnfgksdgojnmfnb';
$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
WHERE username = '".mysql_real_escape_string($_POST['username'])."'
AND password = '$password'");
if (mysql_num_rows($result) < 1) {
/* Access denied */
echo "The username or password you entered is incorrect.";
}
else {
$_SESSION['id'] = mysql_result($result, 0, 'id');
#header("Location: ./");
echo "Hello $_SESSION[id]!";
}
Réponses:
Le moyen le plus simple de sécuriser votre schéma de stockage de mots de passe consiste à utiliser une bibliothèque standard .
Parce que la sécurité a tendance à être beaucoup plus compliquée et avec plus de possibilités de vissage invisibles que la plupart des programmeurs ne pourraient résoudre seuls, l'utilisation d'une bibliothèque standard est presque toujours l'option disponible la plus simple et la plus sûre (sinon la seule).
La nouvelle API de mot de passe PHP (5.5.0+)
Si vous utilisez PHP version 5.5.0 ou plus récente, vous pouvez utiliser la nouvelle API de hachage de mot de passe simplifiée
Exemple de code utilisant l'API de mot de passe de PHP:
(Si vous utilisez toujours l'ancienne version 5.3.7 ou plus récente, vous pouvez installer ircmaxell / password_compat pour avoir accès aux fonctions intégrées)
Amélioration des hashes salés: ajoutez du poivre
Si vous voulez une sécurité supplémentaire, les responsables de la sécurité recommandent maintenant (2017) d'ajouter un `` poivre '' aux hachages de mot de passe (automatiquement) salés.
Il existe une classe simple qui implémente en toute sécurité ce modèle, je recommande: Netsilik / PepperedPasswords ( github ).
Il est livré avec une licence MIT, vous pouvez donc l'utiliser comme vous le souhaitez, même dans des projets propriétaires.
Exemple de code utilisant
Netsilik/PepperedPasswords
:La bibliothèque standard ANCIENNE
Jetez un oeil à: Framework de hachage de mot de passe PHP portable : phpass et assurez-vous d'utiliser l'
CRYPT_BLOWFISH
algorithme si possible.Exemple de code utilisant phpass (v0.2):
PHPass a été implémenté dans certains projets assez connus:
La bonne chose est que vous n'avez pas à vous soucier des détails, ces détails ont été programmés par des personnes expérimentées et examinés par de nombreuses personnes sur Internet.
Pour plus d'informations sur les schémas de stockage des mots de passe, lisez l' article de blog de Jeff : Vous stockez probablement les mots de passe de manière incorrecte
Quoi que vous fassiez si vous optez pour l' approche « je le ferai moi-même, merci », ne l'utilisez plus
MD5
ouSHA1
plus . Ce sont de bons algorithmes de hachage, mais considérés comme défectueux pour des raisons de sécurité .Actuellement, l'utilisation de crypt , avec CRYPT_BLOWFISH est la meilleure pratique.
CRYPT_BLOWFISH en PHP est une implémentation du hachage Bcrypt. Bcrypt est basé sur le chiffrement par bloc Blowfish, utilisant sa configuration de clé coûteuse pour ralentir l'algorithme.
la source
Vos utilisateurs seront beaucoup plus en sécurité si vous utilisez des requêtes paramétrées au lieu de concaténer des instructions SQL. Et le sel doit être unique pour chaque utilisateur et doit être stocké avec le hachage du mot de passe.
la source
Une meilleure façon serait pour chaque utilisateur d'avoir un sel unique.
L'avantage d'avoir un sel est qu'il est plus difficile pour un attaquant de pré-générer la signature MD5 de chaque mot du dictionnaire. Mais si un attaquant apprend que vous avez un sel fixe, il pourrait alors pré-générer la signature MD5 de chaque mot du dictionnaire préfixé par votre sel fixe.
Une meilleure façon est que chaque fois qu'un utilisateur change son mot de passe, votre système génère un sel aléatoire et stocke ce sel avec l'enregistrement de l'utilisateur. Cela rend un peu plus cher la vérification du mot de passe (puisque vous devez rechercher le sel avant de pouvoir générer la signature MD5), mais cela rend beaucoup plus difficile pour un attaquant de pré-générer des MD5.
la source
crypt()
fonction). Et comme vous devez de toute façon récupérer le hachage du mot de passe, l'utilisation d'un sel spécifique à l'utilisateur ne rendra pas la procédure plus coûteuse. (Ou vouliez-vous dire que générer un nouveau sel aléatoire coûte cher? Je ne pense pas vraiment.) Sinon +1.Avec PHP 5.5 (ce que je décris est disponible pour des versions encore plus anciennes, voir ci-dessous) au coin de la rue, j'aimerais suggérer d'utiliser sa nouvelle solution intégrée:
password_hash()
etpassword_verify()
. Il propose plusieurs options pour atteindre le niveau de sécurité des mots de passe dont vous avez besoin (par exemple en spécifiant un paramètre «cost» via le$options
tableau)reviendra
Comme vous pouvez le voir, la chaîne contient le sel ainsi que le coût spécifié dans les options. Il contient également l'algorithme utilisé.
Par conséquent, lors de la vérification du mot de passe (par exemple lorsque l'utilisateur se connecte), lors de l'utilisation de la
password_verify()
fonction complémentaire , il extraira les paramètres cryptographiques nécessaires du hachage du mot de passe lui-même.Lorsque vous ne spécifiez pas de sel, le hachage du mot de passe généré sera différent à chaque appel de
password_hash()
car le sel est généré de manière aléatoire. Par conséquent, la comparaison d'un hachage précédent avec un hachage nouvellement généré échouera, même pour un mot de passe correct.La vérification fonctionne comme ceci:
J'espère que fournir ces fonctions intégrées fournira bientôt une meilleure sécurité par mot de passe en cas de vol de données, car cela réduit la quantité de réflexion que le programmeur doit consacrer à une mise en œuvre appropriée.
Il existe une petite bibliothèque (un fichier PHP) qui vous donnera PHP 5.5
password_hash
en PHP 5.3.7+: https://github.com/ircmaxell/password_compatla source
password_hash()
etpassword_verify
quel que soit le mot de passe (correct ou non) que j'ai utilisé, je me retrouve avec le mot de passe correctÇa me va. M. Atwood a écrit sur la force de MD5 contre les tables arc-en-ciel , et fondamentalement avec un long sel comme ça, vous êtes assis assez (bien que des signes de ponctuation / chiffres aléatoires, cela pourrait l'améliorer).
Vous pouvez également regarder SHA-1, qui semble devenir de plus en plus populaire ces jours-ci.
la source
Je veux ajouter:
Pour la compatibilité avec les anciens systèmes, définissez souvent une limite pour la longueur maximale du mot de passe. C'est une mauvaise politique de sécurité: si vous définissez une restriction, ne la définissez que pour la longueur minimale des mots de passe.
Pour récupérer un mot de passe oublié, vous devez envoyer l'adresse par laquelle l'utilisateur peut changer le mot de passe.
Le hachage du mot de passe peut être obsolète (les paramètres de l'algorithme peuvent être mis à jour). En utilisant la fonction,
password_needs_rehash()
vous pouvez le vérifier.la source