es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OSError: Tipo de paquete extendido

Estoy intentando generar un Hash de acuerdo a la conexión SFTP.

Usando el módulo paramiko como se muestra en el código a continuación. Mi intención es comparar este Hash con el Hash que tendré cuando descifre la firma digital con la clave pública del Host.

Basé mi lógica según la documentación de paramiko que se puede ver aquí: https://docs.paramiko.org/en/stable/api/sftp.html

Entonces, de esta manera, creé un objeto SFTPFile que representa el archivo abierto e intenté usar el método “check”.

Obtuve los archivos correctos, pero necesito verificar el código hash.

¿Alguien más tiene el mismo problema o algo parecido?

Código:

“`python

<h1>Transporte</h1>

host = 'sitio'
puerto = 22
transporte = paramiko.Transport((host, puerto))

<h1>Conectando al servidor</h1>

nombre_de_usuario = 'restringido'
contraseña = 'restringido'
transporte.connect(username = nombre_de_usuario, password = contraseña)

<h1>Cliente SFTP</h1>

sftp = paramiko.SFTPClient.from_transport(transporte)

<h1>Obteniendo archivos</h1>

ruta = 'restringido'
rutalocal = 'restringido'
sftp.get(ruta_local, ruta)

<h1>Lista de archivos</h1>

lista_directorios = sftp.listdir()

<h1>Creado un objeto de archivo para obtener el hash</h1>

objeto_archivo = sftp.file('itaucor67/BMF.xlsx', mode='r', bufsize=-1)

<h1>Intentando obtener el Hash</h1>

objeto_archivo.check('sha1', 0, 0, 1024)

objeto_archivo.close()

sftp.close()
transporte.close()
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para generar un hash según la conexión SFTP, puedes utilizar el módulo paramiko en Python. La documentación de paramiko proporciona un método llamado check() para verificar la integridad de los archivos transferidos a través de SFTP.

    En el código dado, se establece una conexión SFTP y se descargan archivos utilizando el método get(). Para obtener el hash de los archivos descargados, se crea un objeto de archivo utilizando el método sftp.file(). Luego se utiliza el método check() en este objeto de archivo para obtener el código de hash.

    Sin embargo, el método check() debe ser utilizado después de descargar el archivo completo y no solo una parte de él. En el código actual, se llama al método en el objeto de archivo sin leer el archivo completo, lo que podría no devolver el hash correcto.

    Para obtener el hash correcto, puedes leer todo el archivo en un búfer y luego pasar el búfer al método check(). Alternativamente, puedes utilizar el módulo estándar de Python llamado hashlib para generar el código de hash del archivo descargado.

    Una vez que tengas el código de hash del archivo descargado, puedes compararlo con el código de hash obtenido después de descifrar la firma digital con la clave pública del host para verificar la integridad del archivo.

    En resumen, para obtener el código de hash correcto del archivo descargado, puedes modificar el código de la siguiente manera:

    import hashlib
    
    # Estableciendo conexión SFTP
    host = 'sitio'
    puerto = 22
    transporte = paramiko.Transport((host, puerto))
    nombre_usuario = 'restringir'
    contraseña = 'restringir'
    transporte.connect(username=nombre_usuario, password=contraseña)
    
    sftp = paramiko.SFTPClient.from_transport(transporte)
    
    # Descargando archivo
    ruta = 'restringir'
    ruta_local = 'restringir'
    sftp.get(ruta_local, ruta)
    
    # Creando objeto de archivo para obtener el hash
    archivo_obj = sftp.file('itaucor67/BMF.xlsx', mode='r', bufsize=-1)
    
    # Leyendo el archivo completo en un búfer
    buffer = archivo_obj.read()
    archivo_obj.close()
    
    # Generando código de hash usando hashlib
    codigo_hash = hashlib.sha1(buffer).hexdigest()
    
    print('Código de hash:', codigo_hash)
    
    sftp.close()
    transporte.close()
    

    Este código lee el archivo completo en la variable buffer y genera el código de hash utilizando el módulo hashlib. El código de hash luego se puede utilizar para verificar la integridad del archivo.

Comments are closed.