128 lines
3.8 KiB
Python
128 lines
3.8 KiB
Python
import gnupg
|
|
import json
|
|
import pyodbc
|
|
|
|
# Función para obtener conexión a MSSQL
|
|
def obtener_conexion():
|
|
return pyodbc.connect(
|
|
'DRIVER={ODBC Driver 18 for SQL Server};'
|
|
'SERVER=140.82.58.83,14338;'
|
|
'DATABASE=licencias;'
|
|
'UID=sa;'
|
|
'PWD=hG0eT6P9CDXQmbVQ3S4IHPX5drBMVxog;'
|
|
'TrustServerCertificate=yes'
|
|
)
|
|
|
|
def leer_descifrar_y_validar_licencia(archivo_licencia, passphrase):
|
|
# Inicializar GPG
|
|
gpg = gnupg.GPG()
|
|
|
|
try:
|
|
# Leer el archivo cifrado
|
|
with open(archivo_licencia, 'rb') as f:
|
|
contenido_cifrado = f.read()
|
|
|
|
# Descifrar los datos
|
|
descifrado = gpg.decrypt(contenido_cifrado, passphrase=passphrase)
|
|
|
|
if not descifrado.ok:
|
|
print(f"Error al descifrar los datos: {descifrado.status}")
|
|
return
|
|
|
|
print("Licencia descifrada correctamente.")
|
|
|
|
# Verificar la firma de los datos
|
|
verificacion = gpg.verify(descifrado.data)
|
|
|
|
if verificacion:
|
|
print("La firma de la licencia es válida.")
|
|
else:
|
|
print("La firma de la licencia no es válida.")
|
|
print(f"Detalles de la verificación de la firma: {verificacion.stderr}")
|
|
return
|
|
|
|
# Extraer los datos JSON de la parte firmada
|
|
datos_firmados = descifrado.data.decode('utf-8')
|
|
|
|
# Los datos firmados con PGP suelen tener la forma:
|
|
# -----BEGIN PGP SIGNED MESSAGE-----
|
|
# Hash: SHA512
|
|
#
|
|
# {
|
|
# "software": "MINDS",
|
|
# ...
|
|
# }
|
|
#
|
|
# Debemos eliminar los encabezados PGP para obtener el JSON puro.
|
|
|
|
# Buscar el comienzo del JSON real (después de los encabezados PGP)
|
|
json_inicio = datos_firmados.find("{")
|
|
json_final = datos_firmados.rfind("}")
|
|
|
|
if json_inicio == -1 or json_final == -1:
|
|
print("No se pudo encontrar el bloque JSON en los datos firmados.")
|
|
return
|
|
|
|
# Extraer el bloque JSON
|
|
datos_licencia_json = datos_firmados[json_inicio:json_final + 1]
|
|
|
|
# Convertir el JSON a un diccionario de Python
|
|
datos_licencia = json.loads(datos_licencia_json)
|
|
|
|
print("Datos de la licencia:")
|
|
print(datos_licencia)
|
|
|
|
# Verificar los datos contra la base de datos
|
|
if verificar_datos_contra_bd(datos_licencia):
|
|
print("La licencia es válida y coincide con los datos en la base de datos.")
|
|
else:
|
|
print("La licencia no coincide con los datos almacenados en la base de datos.")
|
|
|
|
except Exception as e:
|
|
print(f"Error al leer, descifrar y validar la licencia: {str(e)}")
|
|
|
|
def verificar_datos_contra_bd(datos_licencia):
|
|
try:
|
|
# Conectar a la base de datos MSSQL
|
|
conn = obtener_conexion()
|
|
cursor = conn.cursor()
|
|
|
|
# Consultar los datos de la licencia en la base de datos
|
|
cursor.execute('''
|
|
SELECT * FROM licencias
|
|
WHERE software = ?
|
|
AND version = ?
|
|
AND license_key = ?
|
|
AND expiry_date = ?
|
|
AND licensed_to = ?
|
|
''', (
|
|
datos_licencia['software'],
|
|
datos_licencia['version'],
|
|
datos_licencia['license_key'],
|
|
datos_licencia['expiry_date'],
|
|
datos_licencia['licensed_to']
|
|
))
|
|
|
|
# Obtener el resultado de la consulta
|
|
resultado = cursor.fetchone()
|
|
conn.close()
|
|
|
|
# Verificar si se encontraron coincidencias
|
|
return resultado is not None
|
|
|
|
except pyodbc.Error as e:
|
|
print(f"Error al verificar la licencia en la base de datos: {str(e)}")
|
|
return False
|
|
|
|
# Archivo de licencia cifrado
|
|
archivo_licencia = 'licencia.cbs'
|
|
|
|
# Frase de paso para descifrar
|
|
passphrase = '172999'
|
|
|
|
# Llamar a la función para leer, descifrar y validar la licencia
|
|
leer_descifrar_y_validar_licencia(archivo_licencia, passphrase)
|
|
|
|
|
|
|