<jupyter_start><jupyter_text>Protection des donnéesInternet est un monde **ouvert** où tout est accessible. Il est donc très important de protéger ses données **sensibles** (tout ce qui touche à votre vie privée). ![](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Anonymous_emblem.svg/480px-Anonymous_emblem.svg.png) Objectifs1. Comprendre le système de fichiers1. Connaître quelques commandes UNIX1. Comprendre l'importance d'un bon mot de passe  Télécharger un dossier* Depuis moodle, téléchargez le dossier ```dossier-a-hacker.zip```* Depuis le dossier ```Téléchargements``` tirez le dossier ```dossier-a-hacker``` dans l'explorateur de fichiers de jupyter-lab  Ben ranger pour mieux retrouverVotre ordinateur stocke des données localement. Sur un ordinateur Mac, chaque donnée est un fichier. Chaque fichier peut se trouver dans un dossier qui lui même peut se trouver dans un autre dossier. C'est une structure en arbre ou une **arborescence** où la racine est représentée par le signe ```/```:![](https://pixees.fr/informatiquelycee/n_site/img/nsi_prem_base_linux_2.png)Vous pouvez retrouver cette arborescence sous forme graphique dans le finder:![](https://osxdaily.com/wp-content/uploads/2010/02/mac-os-x-finder-column-view.JPG)où chaque colonne représente un niveau dans la structure représentée par un nouveau dossier. Chemin vers un fichierChaque fichier possède donc un chemin depuis la racine. Par exemple le fichier ```README.txt``` qui se trouve dans le répertoire ```dossier-a-cracker``` possède le chemin ```/home/L12345/dossier-a-cracker/README.txt``` (le second dossier ```L12345``` sera différent pour vous : c'est votre identifiant à la place)Ce chemin se retrouve dans propriétés du fichier (clic droit : ```Get info```) (FIXME : écrire la version française !!) **Exercice** : Cliquez avec le bouton droite sur le fichier ```README.txt``` et retrouvez le chemin de ce fichier  Devenons des AnonymousAvant l'invention de la souris, toutes les interactions avec l'ordinateur se faisaient avec des **lignes de commandes**. Aujourd'hui encore, les professionnels utilisent ces lignes de commandes parce qu'elle permettent de gagner du temps (on garde ses mains sur le clavier, pas sur la souris).  Ouverture d'un terminalDans Jupyter Lab, ouvrez un nouveau terminal : Fichier -> Nouveau -> Terminal. Cela va ouvrir un nouvel onglet "Terminal" dans lequel vous pouvez écrire des commandes à l'ordinateur![](https://user-images.githubusercontent.com/4312421/28751772-9855637c-7510-11e7-900e-552b39a498f7.PNG)FIXME: Prendre un screenshot au gymnase  Commandes dans le terminal Plusieurs commandes sont importantes à connaître :| Commande  | paramètre |  Résultat  | exemple | |---|---|---|---|| ```pwd```  | | affiche le chemin du répertoire où nous nous trouvons  | ```pwd``` || ```cd```  | nom du répertoire | change de répertoire |```cd dossier-a-cracker``` va aller dans le répertoire ```dossier-a-cracker``` || | | | ```cd .. ``` va aller dans le répertoire parent|| ```cat```  | un nom de fichier | Affiche le contenu d'un fichier (attention : seulement les fichiers de type texte) | ```cat README.txt``` va afficher le contenu du fichier ```README.txt``` || ```ls```  | | affiche les  fichiers et dossiers du répertoire où nous nous trouvons | ```ls``` | **Exercice** En utilisant les commandes ```ls```, ```cd``` et ```cat```, affichez le contenu du fichier ```README.txt```  Mot de passeIl sert à protéger ses données privées dans les réseaux sociaux, sur son téléphone portable, etc.. Il doit être difficile à trouver pour un être humain, mais surtout pour un ordinateur. L'[EPFL](https://wiki.epfl.ch/secure-it/questcequunbonmotdepasse) donne quatre caractéristiques pour un **bon mot de passe** :1. il n'est **pas basé sur un mot courant** (nom, prénom, etc..)1. il doit être **long**1. il ne doit pas contenir des **répétitions**1. il doit contenir des caractères **variés** (lettres, accents, chiffres, caractères spéciaux)Malheureusement, beaucoup de personnes ont encore des mots de passe trop simple **Exercice** Recherchez sur Internet quel est le mot de passe le plus utilisé pour les utilisateurs francophones  Qualité d'un mot de passeLe fichier ```dossier-a-cracker/passwords.txt``` contient les **20'000 mots de passes** les plus utilisés sur l'Internet francophone. Nous allons l'utiliser pour vérifier la qualité d'un mot de passe.L'instruction Python suivante permettent de stocker dans la liste ```passwords``` les 20'000 mots de passes du fichier ```dossier-a-cracker/passwords.txt```<jupyter_code>passwords = [line.rstrip() for line in open('dossier-a-cracker/passwords.txt', "r")]<jupyter_output><empty_output><jupyter_text>On peut ensuite accéder au mot de passe le plus utilisé (en position 0 dans la liste)<jupyter_code>print(passwords[0])<jupyter_output><empty_output><jupyter_text>**Exercice** Affichez le 1000ème mot de passe le plus utilisé Il est ensuite possible de comparer si un mot de passe existe dans cette liste. Nous définissons une fonction ```mdp_Existe(mdp)``` qui prend en paramètre le mot de passe à tester contre toute la liste connue.Testez avec ```iloveyou```, ```cristiano7``` ou ```licorne2```<jupyter_code>def mdp_existe(mdp):
    existe = False
    for mot_de_passe in passwords:
        if mdp == mot_de_passe:
            existe = True
    if existe:
        print('Le mot de passe',mdp,'existe dans la liste')
    else:
        print('Le mot de passe',mdp,'n\'existe PAS dans la liste')

mdp1 = 'iloveyou'
mdp_existe(mdp1)
mdp2 = 'cristiano7'
mdp_existe(mdp2)
mdp3 = 'licorne2'
mdp_existe(mdp3)<jupyter_output><empty_output><jupyter_text>**Exercice** depuis le Terminal, utilisez une commande UNIX pour afficher tout le contenu du fichier ```dossier-a-cracker/passwords.txt```. Testez ensuite avec l'avant-dernier mot de passe de la liste **Exercice** : Pensez à un mot de passe et testez-le contre la liste de 20000:<jupyter_code>mdp = input('Entrez un mot de passe:')
mdp_existe(mdp)<jupyter_output><empty_output><jupyter_text>Majuscules-MinusculesParfois ajouter une majuscule peut donner l'impression qu'un mot de passe est plus sûr. Le mot de passe ```coucou2``` se trouve dans la liste:<jupyter_code>mdp = 'coucou2'
mdp_existe(mdp)<jupyter_output><empty_output><jupyter_text>Mais le mot de passe ```CouCou``` n'y est pas :<jupyter_code>mdp = 'CouCou2'
mdp_existe(mdp)<jupyter_output><empty_output><jupyter_text>Il est alors possible de vérifier toutes les combinaisons en modifiant la fonction ```mdp_existe()```  en metttant d'abord toutes les lettre en minuscules, puis en les comparant avec la fonction ```lower()``` :<jupyter_code>def mdp_existe_maj_min(mdp):
    existe = False
    mot = ''
    for mot_de_passe in passwords:
        if mdp.lower() == mot_de_passe.lower():
            existe = True
            mot = mot_de_passe
    if existe:
        print('Le mot de passe',mdp,'existe dans la liste sous la forme',mot)
    else:
        print('Le mot de passe',mdp,'n\'existe PAS dans la liste')<jupyter_output><empty_output><jupyter_text>On l'appelle ensuite sur la chaîne qui mélange majuscules et minuscules<jupyter_code>mdp = 'CouCou2'
mdp_existe_maj_min(mdp)<jupyter_output><empty_output><jupyter_text>Attaque par force bruteLe fichier ```dossier-a-cracker/confidentiel/mails_FBI.zip``` a été protégé contre l'extraction par un mot de passe. Si vous tentez d'extraire l'archive, vous devez fournir un mot de passe :```consolevkeller@barolo:~$ cd dossier-a-cracker/confidentiel/vkeller@barolo:~/dossier-a-cracker/confidentiel$ unzip mails_FBI.zip Archive:  mails_FBI.zip[mails_FBI.zip] original/mails_FBI.txt password:    skipping: original/mails_FBI.txt  incorrect passwordvkeller@barolo:~/edunum/doc/python/vi/5/dossier-a-cracker/confidentiel$```La fonction ```check_ret(mdp,archive)``` va tester un mot de passe ```mdp``` sur l'archive protégée ```archive```<jupyter_code>import subprocess
def check_ret(mdp,archive):
    rc = -1
    p1 = subprocess.Popen(['unzip', '-t','-q', '-P', mdp,archive])
    p1.wait()
    rc = p1.returncode
    p1.kill()
    return rc<jupyter_output><empty_output><jupyter_text>Il est maintenant possible de tester tous les mots de passe de la liste sur une archive protégée par un mot de passe. Le fichier se trouve au chemin ```dossier-a-cracker/confidentiel/mails_FBI.zip```**Attention** cette opération est longue, on doit comparer toute la liste !<jupyter_code>for mdp in passwords:
#    print('retour pour',mdp,':',check_ret(mdp))
    ret = check_ret(mdp,'dossier-a-cracker/confidentiel/mails_FBI.zip')
    if ret == 0:
        print('Le mot de passe est :',mdp)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11242329512562232, 'fraction_numerical': 0.012851684612712747, 'mean_word_length': 5.201005025125628, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 43, 'https://': 5, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '456674', 'license': 'MIT', 'n_tokens_mistral': 3104, 'n_tokens_neox': 3027, 'n_words': 948, 'path': 'doc/python/vi/5/Cracker_un_mot_de_passe.ipynb', 'repo_name': 'LeilaBHC/edunum', 'size': '8637'}