Mostramos un sencillo ejemplo en Python que, a partir de un fichero comprimido con contraseña 7zip y un fichero de contraseña posibles (diccionario), mediante fuerza bruta, comprueba todas las contraseñas del diccionario y si alguna es la correcta la obtiene y la muestra. Se trata de un ejemplo para test de seguridad, para que aprendamos a establecer contraseñas que no estén en diccionarios.
- Código fuente Python para extraer contraseña de fichero 7zip mediante fuerza bruta (diccionario).
- Ejecutar el script Python para obtener contraseña de fichero 7zip.
- Recomendaciones para establecer contraseñas seguras.
Código fuente Python para extraer contraseña de fichero 7zip mediante fuerza bruta (diccionario)
El código fuente en Python para leer todas las contraseñas contenidas en un fichero (diccionario) e ir comprobando una a una si es la correcta para un fichero comprimido 7zip es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import os, sys, subprocess #Leyendo parámetro 1: el nombre del fichero 7zip fichero7zip = sys.argv[1] #Leyendo parámetro 2: el nombre del fichero de diccionario de palabras ficheroDiccionario = sys.argv[2] print ("Leyendo fichero de diccinario {0}...".format(ficheroDiccionario)) f = open(ficheroDiccionario, 'r', errors='ignore') palabrasDiccionario = f.read().splitlines() print ("Buscando coincidencia por fueza bruta en fichero 7zip {0}...".format(fichero7zip)) print ("Se usuará el diccionario: {0}...".format(ficheroDiccionario)) numPalabrasDiccionario = len(palabrasDiccionario) print ("Se buscarán {0} palabras, el proceso puede durar varias horas, no cierre esta ventana...\n\n".format(numPalabrasDiccionario)) numPalabraActual = 0 for palabraActual in palabrasDiccionario: numPalabraActual = numPalabraActual + 1 porcentajeCompletado = round((numPalabraActual*100)/numPalabrasDiccionario, 2) if numPalabraActual != numPalabrasDiccionario: print("Comprobando por fuerza bruta palabra {0}/{1} {2}% completado".format(numPalabraActual, numPalabrasDiccionario, porcentajeCompletado), end="\r") else: print("Comprobando por fuerza bruta palabra {0}/{1} {2}% completado".format(numPalabraActual, numPalabrasDiccionario, porcentajeCompletado)) #x = os.system(r'"C:\\Program Files\\7-Zip\\7z.exe" e {0} -p{1} -y >nul'.format(fichero7zip, palabraActual)) FNULL = open(os.devnull, 'w') x = subprocess.call(r'"C:\\Program Files\\7-Zip\\7z.exe" e {0} -p{1} -y"'.format(fichero7zip, palabraActual), stdout=FNULL, stderr=subprocess.STDOUT) if x == 0: print ("\n\nLa contraseña es: {0}\n\n".format(palabraActual)) exit(1) print ("\n\n¡No se ha encontrado la contraseña en el diccionario!\n\n") |
En el código anterior, suponemos que está instalado 7zip en la carpeta:
C:\Program Files\7-Zip\
En caso de estar en otra carpeta el fichero 7z.exe, se especificará en la línea correspondiente del código.
El código Python de ejemplo muestra el progreso en función de la palabra actual comprobada del diccionario y el total de palabras que hay en el diccionario.
Ejecutar el script Python para obtener contraseña de fichero 7zip
Si guardamos el código Python en un fichero, por ejemplo con el nombre contraseña_7zip.py y lo ejecutamos con el comando:
& «C:/Program Files/python.exe» d:/ProyectoA_Python/Contraseña7zip/contraseña_7zip.py D:\ProyectoA_Python\Contraseña7zip\a.7z D:\ProyectoA_Python\Contraseña7zip\1.dic
En el comando anterior suponemos lo siguiente:
- Que tenemos el fichero python.exe instalado en la carpeta C:/Program Files/
- Que tenemos el fichero 7zip en D:\ProyectoA_Python\Contraseña7zip\, con el nombre a.7z
- Que tenemos el fichero de diccionario con las posibles contraseñas en D:\ProyectoA_Python\Contraseña7zip\ con el nombre 1.dic
- Que el fichero 1.dic contiene una serie de palabras que puedan ser la contraseña, separadas por un salto de línea:
Si el programa encuentra la contraseña correcta para descomprimir el fichero 7zip la mostrará con el mensaje «La contraseña es: ….»:

Y en caso de no encontrarla en el diccionario, tras comprobar todas las palabras, mostrará el mensaje «¡No se ha encontrado la contraseña en el diccionario!»:

Recomendaciones para establecer contraseñas seguras
Como podemos comprobar, la efectividad de este método de extracción de contraseña de un fichero comprimido 7zip irá en función del diccionario empleado. Por ello, por seguridad, recomendamos usar contraseñas que no tengan que ver con nombres, palabras, animales, lugares o cualquier otra combinación que sea susceptible de estar en un diccionario. Lo ideal es usar una combinación de caracteres numéricos, letras y especiales que no tengan significado.
Hay infinidad de diccionarios disponibles para descarga de varias temáticas. Todos ellos contienen millones de palabras y combinaciones. Por ello, repetimos, cuando se introduce una contraseña, sea en un fichero comprimido 7zip o en cualquier otro medio, recomendamos usar palabras sin significado ni posibilidad de que existan en diccionarios.
Un ejemplo de contraseñas inseguras y fácilmente detectables por fuerza bruta:
Murcia2000
España…
123456
8888888
Juan27
Un ejemplo de contraseñas seguras, que no estarán en diccionarios ni se podrán obtener con combinaciones de estos:
8U.h3pa*2KR7
iOh,249%fgUW