Cacher un répertoire sous Windows 10 à l’aide de Python

Cacher un répertoire sous Windows 10 à l’aide de Python

Cacher un répertoire sous Windows 10 à l’aide de Python est une requête plutôt courante quand on pense qu’en version normale, Windows ne permet pas de cacher et chiffrer un répertoire de façon efficace. On peut cependant avoir recours à quelques astuces…

cacher répertoire windows 10 python

Principe de base pour cacher un répertoire sous Windows 10

On va d’abord décider du nom du répertoire : ce sera “private“.

On se met par défaut dans n’importe quel répertoire (par exemple, “Mes Documents”). L’idée est de créer le répertoire (s’il n’existe pas) puis de le renommer en “répertoire système” et de le cacher. Cette méthode m’a été inspirée par le script BATCH suivant, que j’ai pu trouvé à plusieurs endroits sur le net:

cls 
@ECHO OFF 
title Dossier Privé 
if EXIST "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" goto UNLOCK 
if NOT EXIST Private goto MDLOCKER 
:CONFIRM 
echo Êtes vous sûr de vouloir bloquer les fichiers Y=Oui N=Non(Y/N) 
set/p "cho=>" 
if %cho%==Y goto LOCK 
if %cho%==y goto LOCK 
if %cho%==n goto END 
if %cho%==N goto END 
echo Choix invalide. 
goto CONFIRM 
:LOCK 
ren Private "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" 
attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" 
echo Dossier sécurisé
goto End 
:UNLOCK 
echo Entrer le mot de passe pour déverrouillé 
set/p "pass=>" 
if NOT %pass%== mathieu goto FAIL 
attrib -h -s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" 
ren "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" Private 
echo Dossier déverrouillé GG 
goto End 
:FAIL 
echo Mot de passe incorrect
goto end 
:MDLOCKER 
md Private 
echo Private a bien été créé 
goto End 
:End	

Source : https://www.commentcamarche.net/faq/426-proteger-un-dossier-par-mot-de-passe#definir-un-mot-de-passe

Sur ces pages, on dit de sauvegarder ce fichier en ***.bat et avec un double-clic, on peut le lancer… Il fonctionne mais le problème est qu’en l’éditant, on voit le mot de passe… ce qui n’est pas très malin!

J’avais donc envie de faire un script Python légèrement mieux. Vais-je y arriver ? Le suspens est à son comble…

Script Python pour cacher un répertoire sous Windows 10

Le script suivant est “rudimentaire”, dans le sens où je n’ai pas cherché à l’optimiser. Je voulais simplement avoir un script fonctionnel.

from os import path, mkdir, rename, system
from hashlib import blake2b
       
def lock(root,name_rep):
    rename(root+name_rep,root+'Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}')
    cmd = 'attrib +h +s "'+root+'Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"'
    system(cmd)
    
def unlock(root,name_rep,mdp):
    pwd = input('Entrez le mot de passe: ')
    if blake2b(bytes(pwd,'utf8')).hexdigest() != mdp: # indiquer ici le mot de passe
        unlock(mdp)
    else:
        cmd = 'attrib -h -s "'+root+'Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"'
        system(cmd)
        rename(root+'Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}',root+name_rep)
        
if __name__ == '__main__':
    # à changer -------->
    root = 'C:\\Users\\Stephane\\Documents\\'
    name_rep = 'private'
    # blake2b(b'mot de passe').hexdigest() pour obtenir ceci :
    password = '66bf7e550c9e642472559ad1cf0eafa7ca24c98eeb62d00268152ef988f89fb7ecefcc5e58d227fad4d3d35989f4fc55dee1d3f189795bb60b0724102a519cdf'
    # ------------------>
    if path.exists(root+'Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}'):
        unlock(root,name_rep,password)
        
    if not path.exists(root+name_rep):
        mkdir(root+name_rep)
        
    rep = input('Cacher le dossier (O/N) ? ').upper()
    if rep == 'O':
        lock(root,name_rep)

Expliquons pas-à-pas ce script:

  • lignes 1 et 2 : nous allons nous servir des fonctions path, mkdir, rename, system du module os, pour diverses manipulations des noms de répertoires, ainsi que de la fonction de hachage blake2b du module hashlib, pour chiffrer le mot de passe.
  • lignes 4 à 7 : on définit ici la fonction lock, qui prend pour arguments le chemin d’accès au répertoire où nous souhaitons créer le répertoire caché (root) ainsi que le nom du répertoire que l’on souhaite cacher (name_rep), et qui a pour objectif de renommer le répertoire en “Control Panel.{…}” (afin qu’il ne puisse pas être vu par l’explorateur de Windows 10). La ligne 5 renomme et la ligne 7 exécute la commande “attrib +h +s …” qui cache (+h) et sécurise (+s) le répertoire.
  • lignes 9 à 16 : on définit ici la fonction unlock qui a pour objectif de “décacher” le répertoire si le mot de passe est correct. Afin de ne pas rendre visible le mot de passe, on compare le hachage de la saisie avec celui du mot de passe.
  • lignes 18 à 33 : ce sont les instructions qui s’exécutent au lancement du script. On définit (lignes 20 et 21) d’abord respectivement le chemin et le nom du répertoire à cacher, puis (ligne 23) le mot de passe. Pour l’obtenir, on pourra taper dans la console python, la commande : “blake2b(b’mot de passe’).hexdigest()” puis recopier le résultat. Bien sûr, il faut remplacer “mot de passe” par votre… mot de passe (surprise !). Ensuite, si le répertoire existe, on demande si l’on veut le faire apparaître (fonction unlock); sinon, on le créé et on demande si on veut le cacher.

Le principal problème

Et oui, vous vous doutez bien qu’il y a un problème! En effet, avec un simple parcours du répertoire racine (root) – et ce, avec la fonction walk du module os, on peut tout de même voir le répertoire “Control Panel.{…}”.

Une solution serait de chiffrer le répertoire. Pour cela, on pourrait faire un chiffrement affine ou un chiffrement de Hill des fichiers, mais bon… On peut faire directement appel au module PyCryptodome. Mais avant d’installer ce module, assurez-vous que le répertoire suivant n’existe pas:

c:\users\<nom utilisateur>\appdata\local\programs\python\python38-32\lib\site-packages\crypto\

S’il existe, il faut désinstaller le module coupable de l’existence de ce répertoire. Cela peut être le module crypto:

>>> pip uninstall crypto

Et s’il existe encore, supprimez-le manuellement car le module PyCryptodome s’installe dans ce répertoire alors s’il existe, ça va foutre la merde… Et rien ne fonctionnera! Donc, une fois que nous sommes assuré.e.s que le répertoire n’existe pas, on installe le module:

>>> pip install pycryptodome

On peut alors parcourir le répertoire à chiffrer et s’inspirer des exemples de la page https://pycryptodome.readthedocs.io/en/latest/src/examples.html.

Cela dit, quand on chiffre un répertoire, pourquoi le cacher ensuite ? Peut-être pour ne pas susciter de questions… Imaginez que vous souhaitez garder secret le fait que vous connaissez la recette des œufs au lait de mamie Simone… ceux dont tout le monde raffole ! Dans ce cas, en effet, ça vaut peut-être le coup de créer un répertoire dont personne ne soupçonne l’existence, de le cacher et de le crypter au cas où le fiston, élève en Terminale NSI et féru de nouvelles expériences numériques, déciderait un jour de scripter pour scanner tout le disque dur…

Stéphane Pasquet
Stéphane Pasquet

Laissez votre message

Supportscreen tag