Forum Astuces.divers [Admin] Construire des mots de passe forts mais facilement reconstructibles

Posté par  (site web personnel) .
Étiquettes : aucune
1
10
nov.
2007
Voici un petit script en python qui construit des mots de passe forts (pas dans les dictionnaires) en prenant les 8 premiers caractères de la version base64 du digest hexadécimal sha de la concaténation d'un mot de passe maitre (unique) faible mais simple à retenir et d'une clef specifique au domaine d'utilisation du mot de passe (typiquement le nom du service ou de la machine).

Cette méthode permet de construire un ensemble illimité de mot de passe à partir d'un mot de passe maitre unique donc facilement mémorisable pour pouvoir retrouver tous les autres en cas d'oublis.

La base64 sert à avoir une distribution des caractères sur l'alphabet complet (majuscules et minuscule) + les characteres numeriques.

Voici donc mkpasswd.py


#!/usr/bin/python
"""Utility script to build a set of strong yet rebuildable passwords

The final password is build from a potentialy weak but easy to remember yet
secret master password and a domain-specific key like the name of the website
you are building a password for.

The password is then the 8th first characters of the base64 encoding of
hexadecimal sha digest of the concatenation of the master seed and the domain
key::

>>> make_password("foobar", "amazon")
'YWRjM2Fl'

>>> make_password("foobar", "paypal")
'MzM2Yzhm'

>>> make_password("foobar", "paypal", lowercase=True)
'mzm2yzhm'

:author: Olivier Grisel <olivier.grisel@ensta.org>

This script is placed in the Public Domain:
http://creativecommons.org/licenses/publicdomain/
"""

import sha, base64

LENGTH = 8
LOWERCASE = False

def make_password(master_seed, domain_key, lowercase=LOWERCASE):
hash = sha.new(master_seed + domain_key).hexdigest()
password = base64.b64encode(hash)[:LENGTH]
if lowercase:
return password.lower()
else:
return password

def main():
# seed and domain prefix are read interactively from stdin to avoid
# password data to be stored in the shell command history
master_seed = raw_input("master seed: ")
domain_key = raw_input("domain key [e.g. 'paypal']: ")
print "your password is:", make_password(master_seed, domain_key)

def _test():
import doctest
doctest.testmod()

if __name__ == "__main__":
import sys
if len(sys.argv) > 1 and sys.argv[1] == "--selftest":
_test()
else:
main()


Utilisation:

$ python mkpasswd.py

Pour lancer les tests:

$ python mkpasswd.py --selftest
  • # Utilisation de getpass

    Posté par  . Évalué à 1.

    Pour éviter d'afficher le "master seed" à la saisie, tu peux utiliser getpass.


    import sha, base64, getpass
    [...]
    master_seed = getpass.getpass("master seed: ")


    Etienne
  • # presque pareil sans outils :)

    Posté par  . Évalué à 2.

    dans l'idée je fait pareil, mais sans aucun outils,
    bien sur celà n'offre pas les même avantage.
    mais j'ai un mot de passe unique "maitre" auquel je concatene une extention en fonction du domaine (ou un numero de version là ou il faut changer de mot de passe souvent)

    et j'ai une astuce toute bête pour retenir le mot de passe (du coups on peu en avoir deux ou trois en fonction de la criticité)
    il suffit de prendre les paroles d'une chanson que vous connaissez bien..
    exemple "The sweet smell of a great sorrow lies over the land" (pink floyd - sorrow)
    donne comme mot de passe : Tssoagslotl (1ere lettre de chaque mots)
    et en lui ajoutant l'extension : Tssoagslotl-paypal

    du coup ca marche partout, et pas de risque de l'oublier.
    • [^] # Re: presque pareil sans outils :)

      Posté par  . Évalué à 1.

      Un peu risqué comme méthode car cela demande une grande confiance dans le service utilisé.
      Sur le domaine filou.com, tu utiliserais "Tssoagslotl-filou" ?
      Pour peu que l'admin de ce service soit un peu curieux et peu scrupuleux, il aura vite fait de trouver ton mot de passe pour d'autre services. Si en plus tu utilises souvent le même login ou la même adresse mail, t'es mal.

      L'intérêt de la méthode proposée dans cet article est de passer par un digest qui empêche totalement de remonter au mot de passe racine.
  • # pwgen

    Posté par  (site web personnel) . Évalué à 1.

    En plus simple, existe en package debian: pwgen

    $ pwgen -A 10
    wedai5oof1 aechahfoh7 shu3ahbu7u cheeza6ooc phier4eng0 ohtoh3xav5 ihoo4oghee
    moh8aighie aethaed1up haawie2cam iequa0laik aeraenge1u iu6shohyei naenaa7bai

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.