licencias-minds3/leerlicencia2.py

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)