Python crypte du module ce qui est de la bonne utilisation des sels?
D'abord, le contexte: je suis en train de créer une ligne de commande outil basé sur (Linux)
nécessite une connexion. Comptes sur cet outil n'ont rien à voir avec
au niveau du système des comptes -- rien de tout cela ressemble à /etc/passwd.
Je suis de planification pour stocker les comptes d'utilisateur dans un fichier texte en utilisant le même format (à peu près) comme /etc/passwd.
En dépit de ne pas utiliser le système de mot de passe au niveau des fichiers, à l'aide de la crypte semblait
une bonne pratique à utiliser, plutôt que de les stocker mots de passe dans
texte clair. (Alors que la crypte est certainement mieux que de stocker les mots de passe dans
clair, je suis ouvert à d'autres façons de le faire.)
Ma crypte des connaissances est basé sur ceci:
https://docs.python.org/2/library/crypt.html
La documentation semble demander quelque chose qui n'est pas possible: "c'
est recommandé d'utiliser la pleine crypté mot de passe comme le sel lors de la vérification
pour un mot de passe."
Hein? Si je suis de la création de la crypté mot de passe (que, lors de la création d'un utilisateur
record) comment puis-je utiliser le mot de passe crypté comme un sel? Il
n'existe pas encore. (Je suis en supposant que vous devez utiliser le même sel pour la création et la vérification d'un mot de passe.)
J'ai essayé d'utiliser le mot de passe en clair comme du sel. Ce n'
de travail, mais a deux problèmes; on facilement surmontés, et l'un de sérieux:
1) Les deux premières lettres du mot de passe en clair sont inclus dans le
crypté mot de passe. Vous pouvez résoudre ce problème en n'écrit pas les deux premiers
des caractères dans le fichier:
user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)
2) En utilisant le mot de passe en clair que le sel, vous semble
la réduction de la quantité d'entropie dans le système. J'ai peut-être suis
la mauvaise compréhension du but de la sel.
La meilleure pratique j'ai pu en tirer est d'utiliser les deux premières
les caractères de l'identifiant comme le sel. Serait-ce approprié,
ou est-il quelque chose que j'ai raté qui fait qu'un mauvais coup?
Ma compréhension d'un sel, c'est qu'il empêche le pré-calcul de mot de passe
hachages à partir d'un dictionnaire. Je pourrais utiliser un standard de sel pour tous
les mots de passe (comme mes initiales, "JS"), mais qui semble être de moins en moins
charge pour un attaquant que l'aide de deux personnages de chaque utilisateur nom d'utilisateur.
OriginalL'auteur Schof | 2008-12-01
Vous devez vous connecter pour publier un commentaire.
Pour l'utilisation de la crypte module:
Lors de la GÉNÉRATION du mot de passe crypté, vous fournir le sel. Il pourrait aussi bien être aléatoire pour augmenter la résistance à brute-force, tant qu'il remplit les conditions énumérées. Lors de la VÉRIFICATION d'un mot de passe, vous devez fournir la valeur de getpwname, dans le cas où vous êtes sur un système qui prend en charge plus de sel de tailles et de ne pas en produire.
Commentaires généraux:
Si cela n'a rien à faire w/système de connexions, il n'y a rien vous empêcher d'utiliser une méthode de la plus forte que la crypte. Vous pourriez générer de façon aléatoire de N caractères de chaque utilisateur de sel, pour être combiné avec le mot de passe utilisateur dans un hachage SHA-1.
Mise à JOUR: Alors que c'est beaucoup plus sécurisé contre les rainbow tables, la méthode ci-dessus a encore des faiblesses cryptographiques. Bonne application d'un algorithme HMAC pouvez encore augmenter votre sécurité, mais il est au-delà de mon domaine de compétence.
OriginalL'auteur HUAGHAGUAH
Python crypt() est un wrapper pour le système de la fonction crypt (). Linux crypt() de la page de manuel:
Accent est mis sur "deux caractères chaîne". Maintenant, si vous regardez crypt()'comportement en Python:
vous découvrez que les deux premiers caractères du résultat toujours coïncider avec les deux premiers caractères de l'original de sel, ce qui en fait la vraie de deux caractères-sel lui-même.
C'est, le résultat de crypt() est de la forme 2char-sel + crypté-pass.
Par conséquent, il n'y a pas de différence dans le résultat, si au lieu de passer les deux caractères de sel, ou de l'origine de nombreux personnages de sel, de vous transmettre l'ensemble du mot de passe crypté.
Note: l'ensemble [a–zA–Z0–9./] contient 64 caractères, et de 64*64=4096. Voici comment deux caractères se rapportent à "4096 différentes manières".
OriginalL'auteur Federico A. Ramponi
Vous êtes incompréhension de la documentation; il dit que, puisque la longueur de sel peut varier en fonction du sous-jacent crypt() de la mise en œuvre, vous devez fournir l'ensemble de la crypté mot de passe comme le sel de la valeur lors de la vérification des mots de passe. C'est, au lieu de tirer les deux premiers caractères pour être le sel, il suffit de lancer en toute chose.
Votre idée de la présence de l'initiale de sel sera basé sur le nom d'utilisateur semble correct.
OriginalL'auteur genehack
Voici quelques conseils généraux sur le salage des mots de passe:
Je ne serait pas avoir du sel en fonction du mot de passe. Un attaquant devrait générer un arc-en-ciel de la table pour avoir un instantané de recherche de la base de données de mots de passe, mais ils n'ont à faire qu'une seule fois. Si vous choisissez un hasard entier de 32 bits, il devrait générer 2^32 tableaux, qui (à la différence d'un déterministe de sel) coûts façon, beaucoup trop de mémoire (et de temps).
OriginalL'auteur ojrac
Pour certains plus de solidité, vous pouvez obtenir la crypte module d'utiliser md5 à l'aide d'un sel dans le format.
où ABCDEFGH est le sel de la chaîne.
(à noter que c'est une extension gnu pour la crypte, voir "l'homme de la crypte" sur un système linux). MD5 (et maintenant même SHA1) peut être "cassé", mais ils sont encore relativement bonne pour le hachage de mots de passe, et md5 est encore la norme pour linux les mots de passe locaux.
crypt.crypt("some_password","$5$some_salt")
oucrypt.crypt("some_password","$6$some_salt")
à utiliser sha-256 ou sha-512 si vous n'avez pas confiance en MD5. Notez également que la crypte utilise de multiples séries de DES/MD5/SHA* pour le rendre plus sécurisé puis juste à l'aide d'un seul tour. Donc MD5 rompu ne signifie pas nécessairement que la crypte avec $1$.OriginalL'auteur JimB
Le mot de passe ou quoi que ce soit dérivé du mot de passe ne doit jamais être utilisé comme sel. Le sel pour un mot de passe doit être imprévisible.
Un nom d'utilisateur ou une partie du nom de l'utilisateur est tolérable, mais il serait encore mieux octets aléatoires à partir d'un chiffrement RNG.
OriginalL'auteur erickson
Utilisation PBKDF2, voir ce commentaire sur un thread différent (comprend Python de mise en œuvre).
OriginalL'auteur orip