Vous n'êtes pas identifié(e).
Pages : 1
Description:
Application qui créé des mots de passe chiffres sur base d\'un code secret et d'options permettant de changer au grès.
Différents sels peuvent être spécifié par l'utilisateur: aucun, date, aléatoire, mot personnalisé avec différentes options pour chacunes.
Un fichier séparé contenant une liste de nom de domaine pourra être chargée afin de créer une liste chiffrée basée sur celle-ci.
Exemple de fichier liste; liste.txt
Pseudo1 gmail.com
Pseudo2 yahoo.fr
moncompte paypal.net
mes.sources sourceforge.net
En créant votre fichier, celui-ci devra répondre à l'expression regulière suivante '[0-9a-zA-Z._-]+[\t ]*[a-z]{4,}.[a-z]{2,3}'. Lorsque une ligne du fichier
ne rencontre pas l'expression régulière, il est filtré (voir dans les exemples d'utilisation)
Changelog:
* 29-12-2013 : version initiale
* 30-12-2013 : rajout des listes, un exemple est donné en bas de page
/!\ code source remis à jour le 30-12-2013 /!\
#! /usr/bin/python
# -*- coding: utf-8 -*-
''' Application qui créé des mots de passe chiffres sur base d\'un code secret '''
''' et d\'options permettant de changer au grès. '''
''' Différents sels peuvent être spécifié par l\'utilisateur: aucun, date, aléatoire, '''
''' mot personnalisé avec différentes options pour chacunes. '''
''' Un fichier contenant une liste de nom de domaine pourra être chargée afin de créer '''
''' une liste chiffrée basée sur celle-ci. '''
''' Exemple de fichier liste; liste.txt '''
''' Pseudo1 gmail.com '''
''' Pseudo2 yahoo.fr '''
''' moncompte paypal.net '''
''' mes.sources sourceforge.net '''
''' En construction. Projet futur => sortie cvs, xml, html '''
''' Remerciements: '''
''' * boost pour l'exemple sur "hasheur tools" http://linuxtrack.net/viewtopic.php?id=243 '''
''' * google, python.org et stackoverflow pour tout le reste. '''
''' Licensed under the GNU General Public License v3 '''
''' Sous Licence GNU General Public Licence v3 '''
''' Copyright (2013) by WarLocG '''
''' Dernière modification: 2013-12-30 (30 dec 2013) '''
from random import randrange
from commands import getoutput
from hashlib import md5
import sys #système (exit, argv)
import re #expressions regulieres, pour la lecture des fichiers
def main(argv):
args = sys.argv
if (len(args)<3):
usage()
sys.exit()
else:
cmd = ['-d','--date','-l','--listdn=','-m','--manual=','-n','--none','-r','--random=']
if str(args[1])[0]!='-':
data = str(args[1])
else:
usage()
sys.exit()
salt=''
dnfile=''
dncontent=''
fflag = 0 #flag fichier pour -l / --listdn
atteint=0
for arg in args:
pos = args.index(arg)
if arg[:9] in cmd:
if atteint >= 1: break
#options completes
#print(arg+' '+arg[:9]+' '+str(args)+' '+str(pos)+' '+str(len(args))+' '+str(atteint)) #debug test
if (arg == '--date') or (arg == '-d'):
dateoptions = '%b-%Y'
# a venir
salt = getoutput('date +'+dateoptions)
atteint += 1
break
elif (arg[:9] == '--listdn=') and (len(arg[9:]) > 0) and (fflag == 0):
dnfile = str(args[pos])[9:]
fflag = 1
elif (arg[:9] == '--manual=') and (len(arg[9:]) > 0):
salt = str(args[pos])[9:]
atteint += 1
break
elif (arg == '--none') or (arg == '-n'):
salt = ''
atteint += 1
break
elif (arg[:9] == '--random=') and (arg[9:].isdigit()):
taille=int(args[pos][9:])
salt = rnddigit(taille)
atteint += 1
break
#options minimales avec valeur
if (arg == '-l') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-') and (fflag == 0):
dnfile = str(args[pos+1])
fflag = 1
if (arg == '-m') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-'):
salt = str(args[pos+1])
atteint += 1
break
if (arg == '-r') and (pos+1 < len(args)) and (str(args[pos+1])[0]!='-'):
taille = int(args[pos+1])
salt = rnddigit(taille)
atteint += 1
break
if fflag == 1:
print('fichier ouvert: '+dnfile) #debug test
print
dncontent = openfile(dnfile)
if atteint == 0:
usage()
sys.exit()
algo = 'md5'
if dncontent != '':
filtre=''
contents = dncontent.split('\n')
for line in contents:
if (line != '') and (line[0] != '#'):
#print(line)
line = line.replace('\t','@')
line = line.replace('@@','@')
words = line.split('@')
passphrase = md5(data+salt+line).hexdigest()
print "%-15s\t%-15s\t%-50s" % (words[0],words[1],passphrase)
else:
filtre += line+'\n'
if filtre != '':
print
print('Les éléments du fichier qui ont été filtrés:')
print
contents = filtre.split('\n')
for line in contents:
print(line)
else:
passphrase = md5(data+salt).hexdigest()
if salt=='':salt='(aucun)'
print("secret="+data+" sel="+salt+" algorithme="+algo+" => "+passphrase)
def rnddigit(taille):
digits=''
for i in range(taille):
digit = ['0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
]
digits += digit[randrange(len(digit))]
return digits
def openfile(f):
tmp = '' # tampon pour ecriture vers fichier dst
try:
domainfile = open(f,'r')
for line in domainfile:
#print(line.encode('hex')) #debug test: en hexa pour trouver les caracteres invisibles
if re.match('[0-9a-zA-Z._-]+[\t ]*[a-z]{4,}.[a-z]{2,3}',line):
#print('* matches => '+line) # debug test: concordance
tmp += line
else:
tmp += '# '+line
domainfile.close
except IOError:
print('erreur le fichier spécifié ne peut être lu ou n\'existe pas.')
sys.exit()
return tmp
def usage():
print('Usage:')
print(' make-passlist SECRET OPTIONS')
print
print('SECRET mot de passe servant au chiffrement')
print
print('OPTIONS')
print(' -a,--algo=algorithme algorithme de chiffrement (md5, sha1)')
print(' -d,--date sale le chiffrement avec une date au format de date')
print(' (voir man date)')
print(' exemples: %b-%Y => dec-2013 ou %m-%Y => 12-2013')
print(' -l,--listdn=file fichier contenant la liste des domaines a chiffrer')
print(' -m,--manual=key sale le chiffrement manuellement avec key')
print(' -n,--none ne pas saler le chiffrement')
print(' -r,--random sale le chiffrement avec des caractères aléatoires')
print
print('NOTES')
print(' Les options -d,-m,-n et -r ne peuvent être utilisées ensemble et cesseront')
print(' l\'activité des autres options si plusieurs sont utilisées ensembles. La')
print(' première option valide utilisée sera déterminante pour les autres.')
print
if (__name__ == '__main__'):
main(sys.argv)
Le code est encore en cours de construction mais pour montrer un peu ce qu il fait je vais étayer par quelques exemple d'utilisations.
Démonstration:
D'abord l'usage:
[warlocg][linux][~/Desktop/Scripts][00:31:37][user mode]
Enter command here -> python make-passlist.py
Usage:
make-passlist SECRET OPTIONS
SECRET mot de passe servant au chiffrement
OPTIONS
-a,--algo=algorithme algorithme de chiffrement (md5, sha1)
-d,--date sale le chiffrement avec une date au format de date
(voir man date)
exemples: %b-%Y => dec-2013 ou %m-%Y => 12-2013
-l,--listdn=file fichier contenant la liste des domaines a chiffrer
-m,--manual=key sale le chiffrement manuellement avec key
-n,--none ne pas saler le chiffrement
-r,--random sale le chiffrement avec des caractères aléatoires
NOTES
Les options -d,-m,-n et -r ne peuvent être utilisées ensemble et cesseront
l'activité des autres options si plusieurs sont utilisées ensembles. La
première option valide utilisée sera déterminante pour les autres.
[warlocg][linux][~/Desktop/Scripts][00:35:36][user mode]
Enter command here ->
Ensuite quelques exemples de ce que fait déjà mon code:
* possibilité de chiffrer un message en md5 (pour le moment) avec différents sels:
** sans => option -n ou --none
[warlocg][linux][~/Desktop/Scripts][00:35:36][user mode]
Enter command here -> python make-passlist.py monsecret -n
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:37:35][user mode]
Enter command here -> python make-passlist.py monsecret --none
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:37:43][user mode]
Enter command here ->
** digits aléatoires (valeur entière pour la taille) => option -r $nombre ou --random=$nombre
[warlocg][linux][~/Desktop/Scripts][00:37:43][user mode]
Enter command here -> python make-passlist.py monsecret -r 5
secret=monsecret sel=rFCRr algorithme=md5 => 143ac46a858a5c537d71827c0479f497
[warlocg][linux][~/Desktop/Scripts][00:40:07][user mode]
Enter command here -> python make-passlist.py monsecret --random=5
secret=monsecret sel=zsNil algorithme=md5 => 5ee98a08200fe6ab1bd6c86273b94c87
[warlocg][linux][~/Desktop/Scripts][00:40:17][user mode]
Enter command here ->
** date depuis la commande `date +FORMAT`, pour le moment elle ne gere que le format +%b-%Y => option -d ou --date
[warlocg][linux][~/Desktop/Scripts][00:40:17][user mode]
Enter command here -> python make-passlist.py monsecret -d
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:42:21][user mode]
Enter command here -> python make-passlist.py monsecret --date
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:42:28][user mode]
Enter command here ->
** un sel personnalisé => -m $message ou --manual=$message
[warlocg][linux][~/Desktop/Scripts][00:42:28][user mode]
Enter command here -> python make-passlist.py monsecret -m biencache
secret=monsecret sel=biencache algorithme=md5 => bdb3fab9a7dc99356308074f89d81c1e
[warlocg][linux][~/Desktop/Scripts][00:44:19][user mode]
Enter command here -> python make-passlist.py monsecret --manual=biencache
secret=monsecret sel=biencache algorithme=md5 => bdb3fab9a7dc99356308074f89d81c1e
[warlocg][linux][~/Desktop/Scripts][00:44:31][user mode]
Enter command here ->
* Pas encore géré:
** les dates aux formats personnalisés
** les autres algorithmes, le sha1 notamment
** la lecture d un fichier de liste contenant des comptes, qui seront ensuite chiffrés et ecrit dans un fichier séparé => mise a jour du 30-12-2013
* Les conditions testés:
** les cas ou plusieurs options sont utilisés en meme temps => dans le cas d'un -d -n -m ou -r, lorsque l un est utilisé er reussi, un break est effectué, si l option echoue, le suivant sera utilisé
[warlocg][linux][~/Desktop/Scripts][00:44:31][user mode]
Enter command here -> python make-passlist.py monsecret --manual= --random= -d
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:48:50][user mode]
Enter command here ->
Ici --manual= a échouvé car aucune chaine n'a été passé a l option, ensuite --random a échoué car aucune taille n'a été donné, et c'est -d qui a pris le relais
** il tiens compte de l'ordre des options
[warlocg][linux][~/Desktop/Scripts][00:48:50][user mode]
Enter command here -> python make-passlist.py monsecret -n -d
secret=monsecret sel=(aucun) algorithme=md5 => 08ae5cfdbf2fda81090109b3f783f235
[warlocg][linux][~/Desktop/Scripts][00:55:27][user mode]
Enter command here -> python make-passlist.py monsecret -d -n
secret=monsecret sel=déc-2013 algorithme=md5 => e417f9f2aba1b91f5caed08aec5d1fc3
[warlocg][linux][~/Desktop/Scripts][00:55:31][user mode]
Enter command here ->
Les fichiers
Fichier d'exemple (de test)
[warlocg][linux][~/Desktop/Scripts][20:39:43][user mode]
Enter command here -> cat tmp
Pseudo1 googlemail.com
pseudo2 yahoo.fr
={(^_^)}= amail.com
YA_seudo_41 usenet.nl
monPseudo h3ll0.fr
[warlocg][linux][~/Desktop/Scripts][20:39:47][user mode]
Enter command here ->
Test sur mon fichier 'tmp' (contenant 2 lignes à filtrer)
[warlocg][linux][~/Desktop/Scripts][20:39:47][user mode]
Enter command here -> python make-passlist.py secret -l tmp -r 9
fichier ouvert: tmp
Pseudo1 googlemail.com 9c34668876ae25c26453e34aaf3bf4d7
pseudo2 yahoo.fr 5acd7f040a634fc472878b3c7b39d5f2
YA_seudo_41 usenet.nl 0b11b9449fdaa3274fa9843b7f51a537
Les éléments du fichier qui ont été filtrés:
# ={(^_^)}= amail.com
# monPseudo h3ll0.fr
[warlocg][linux][~/Desktop/Scripts][20:40:51][user mode]
Enter command here ->
Code réalisé sous python 2.7, si vous rencontrez un bug veuillez le signaler que je tente de reproduire la cause du soucis et la corriger.
Hors ligne
Je vais tester en 3.3 voir si il tourne également. ou si il faut beaucoup modifier.
Merci
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
Pages : 1