Skip to content
Snippets Groups Projects
Unverified Commit 1518e643 authored by David Beniamine's avatar David Beniamine
Browse files

initial commit

parents
Branches
No related tags found
No related merge requests found
__pycache__
*.sw?
.ropeproject
Readme 0 → 100644
## Todo
+ [ ] Nom
+ [ ] Dictionnaires:
+ [X] Francais
+ [ ] Noms
+ [ ] Films et livres
+ [ ] Packages
+ [ ] Installeur
This diff is collapsed.
File added
from zxcvbn import zxcvbn
from dateutil.parser import parse
import getpass
from test_pass import test_pass
# Read password
passwd = getpass.getpass("Merci d'entrer un mot de passe qui ne sera pas affiché\n")
word = "a"
user_inputs = []
while word != "":
word = input("Veuillez entrer un mot d'aide ou une date au format jj/mm/yyyy pour le système ou tappez [entrer]"
"pour arrêter\n")
if word != "":
try:
date = parse(word)
words = [date.day]
words.append(date.month)
words.append(date.year)
except:
words = [word]
finally:
for word in words:
user_inputs.append(word)
# TODO call wrapper
lines = test_pass(passwd, user_inputs)
for line in lines:
print(line)
#!/usr/bin/python3
# -*- coding: utf-8 -*
import cgi
import re
from test_pass import test_pass
form = cgi.FieldStorage()
print("Content-type: text/html; charset=utf-8\n")
html = """<!DOCTYPE html>
<head>
<title>Testeur de mot de passes</title>
</head>
<body>
<h1> Testez la qualité d'un mot de passe </h1>
"""
if form.getvalue("password") is None:
# Password not defined => show the form
passwordPrompt="Veuillez saisir le mot de passe à tester ci dessous :"
inputsPrompt="Veuillez saisir une suite de mots ou de dates au format jj/mm/yyyy séparées par des virgules:"
sendPrompt="Tester"
html += """
<form action="/index.py" method="post">
<h2> Defenseur.se </h2>
<p> {} </p>
<input type="password" name="password" value="" />
<h2> Attaquant.e </h2>
<p> {} </p>
<input type="text" name="inputs" value="" />
<p>
<input type="submit" name="send" value="{}">
</p>
</form>
""".format(passwordPrompt, inputsPrompt, sendPrompt)
else:
# Split user inputs
field = form.getvalue("inputs")
if field is not None:
inputs = field.split(',')
else:
inputs = None
# Retrieve results
lines = test_pass(form.getvalue("password"), inputs)
# Process results for the web
html += "<h2> {} </h2>".format(lines.pop(0))
inlist = False
for line in lines:
line = re.sub('\*\*(.*)\*\*', '<em>\g<1></em>', line)
if line[0] == "\t":
if inlist:
html +="<li>{}</li>".format(line)
else:
inlist = True
html +="<ul><li>{}</li>".format(line)
elif line[0] != "\n":
if inlist:
html += "</ul>"
inlist = False
html += "<h3>{}</h3>".format(line)
html += """
</body>
<foot>
<p>
Logiciel développé par Tetras Libre, distribué sous Licence AGPL V3.0.
</p>
<p>
Le testeur de mot de passe est basé sur la bibliothèque zxcvbn-python distribué sous licence MIT.
</p>
</foot>
</html>
"""
print(html)
from http.server import HTTPServer
from http.server import CGIHTTPRequestHandler
import cgi
import cgitb
cgitb.enable()
def run(addr, port):
server_address = (addr, port)
server = HTTPServer
handler = CGIHTTPRequestHandler
handler.cgi_directories = ["/"]
print("Serveur actif sur le port :", port)
httpd = server(server_address, handler)
httpd.serve_forever()
if __name__ == "__main__":
run("localhost", 8080)
import os
from zxcvbn import zxcvbn
from zxcvbn.matching import add_frequency_lists
def tr(text):
# TODO translation
return text
def add_dictionnaries():
dicts = {}
directory = os.path.dirname(os.path.realpath(__file__))+'/../data'
for fn in os.listdir(directory):
fn = directory+"/"+fn
if os.path.isfile(fn):
print(fn)
name = os.path.basename(os.path.splitext(fn)[0])
print(name)
with open(fn) as f:
dicts[name] = f.read().splitlines()
add_frequency_lists(dicts)
def test_pass(password, inputs):
# Read input
add_dictionnaries()
results = zxcvbn(password, inputs)
lines = []
lines.append("Résultats du test:\n")
lines.append("Nombre de tentatives : {}".format(results["guesses"]))
times = results["crack_times_display"]
lines.append("Temps requis pour craquer votre mot de passe")
lines.append("\t Dump bases de donnée mal protégée : \t**{}**".format(
tr(times["offline_fast_hashing_1e10_per_second"])))
lines.append("\t Dump bases de donnée, bien protégée : \t**{}**".format(
tr(times["offline_slow_hashing_1e4_per_second"])))
lines.append("\t En ligne, sans protection anti bruteforce : \t**{}**".format(
tr(times["online_no_throttling_10_per_second"])))
lines.append("\t En ligne, avec protection anti bruteforce : \t**{}**".format(
tr(times["online_throttling_100_per_hour"])))
lines.append("\n")
lines.append("Methode de hack utilisées")
if results["sequence"] == []:
lines.append("\tVotre mot de passe n'a été trouvé dans aucun dictionnaire")
else:
for seq in results["sequence"]:
if seq["pattern"] == "bruteforce":
lines.append("\tMot de passe trouvé par force brute")
elif seq["pattern"] == "repeat":
for match in seq["base_matches"]:
print("\tMot de passe trouvé par repetition depuis le dictionnaire {}".
format(tr(match["dictionary_name"])))
elif seq["pattern"] == "date":
lines.append("\tMot de passe trouvé par dates")
elif seq["pattern"] == "sequence":
lines.append("\tMot proche trouvé dans la séquence : '{}'".format(tr(seq["sequence_name"])))
else:
lines.append("\tMot proche trouvé dans le dictionnaire : '{}'".format(tr(seq["dictionary_name"])))
lines.append("\n")
valeur = ["Tres faible", "Faible", "Acceptable", "Correct", "Bon"]
lines.append("Score Global {}/4 : {}".format(results["score"], valeur[results["score"]]))
for key, values in results["feedback"].items():
lines.append("{} :".format(tr(key)))
if not isinstance(values, list):
values = [values]
for val in values:
lines.append("\t{}".format(tr(val)))
return lines
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment