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
Loading
__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