Download de Arquivos com Verificação do Hash SHA 256
Existem diversas ocasiões em que precisamos realizar o download de diversos arquivos que possuem tamanhos expressivos, em nossas redes, sem gerar uma queda na velocidade de internet dos colaboradores e dos clientes. Neste artigo, mostro um script em Python que pode ser agendado durante o período noturno, visando o download de arquivos, além da verificação do Hash SHA 256 de cada arquivo baixado.
[ Hits: 5.827 ]
Por: Diego Mendes Rodrigues em 10/11/2020 | Blog: https://www.linkedin.com/in/diegomendesrodrigues/
""" Download de arquivos da internet com a verificação do hash SHA 256 ou do MD5 - Diego Mendes Rodrigues """ import hashlib import urllib.request import shutil def calcular_md5(caminho_do_arquivo=''): """Calcular o hash MD5 de um arquivo :param caminho_do_arquivo: Caminho completo do arquivo :return: hash MD5 """ # Validar os inputs da função if len(caminho_do_arquivo) <= 0: print('Informe o parâmetro de forma correta') exit(1) with open(caminho_do_arquivo, "rb") as f: bytes_recebidos = f.read() # read entire file as bytes readable_hash = hashlib.md5(bytes_recebidos).hexdigest() return readable_hash def calcular_sha256(caminho_do_arquivo=''): """Calcular o hash SHA 256 de um arquivo :param caminho_do_arquivo: Caminho completo do arquivo :return: hash SHA 256 """ # Validar os inputs da função if len(caminho_do_arquivo) <= 0: print('Informe o parâmetro de forma correta') exit(1) with open(caminho_do_arquivo, "rb") as f: bytes_recebidos = f.read() # read entire file as bytes readable_hash = hashlib.sha256(bytes_recebidos).hexdigest() return readable_hash def download_do_arquivo(url_do_arquivo='', pasta_onde_salvar=''): """Realizar o download de um arquivo que está em uma URL :param url_do_arquivo: URL onde o arquivo está na internet :param pasta_onde_salvar: Pasta onde o arquivo será armazenado no computador :return: True no caso de sucesso, ou seja, download completo, ou False caso contrário """ # Validar os inputs da função if len(url_do_arquivo) <= 0: print('Informe o parâmetro de forma correta') return False if len(pasta_onde_salvar) <= 0: pasta_onde_salvar = './' file_name = url_do_arquivo.split('/') # Download do arquivo salvando ele localmente com o nome especificado em `file_name` with urllib.request.urlopen(url_do_arquivo) as response, open(pasta_onde_salvar + file_name, 'wb') as out_file: shutil.copyfileobj(response, out_file) return True def validar_hash(hash1='', hash2='', sha256=True): """Verificar se os 2 hashs são idênticos :param hash1: Hash 1 que será verificado :param hash2: Hash 2 que será verificado :param sha256: True caso o hash seja SHA 256, False caso seja um MD5 :return: True caso os hashs sejam idênticos, False caso contrário """ # Validar os inputs da função if len(hash1) != len(hash2): print('Informe os parâmetros de hash da forma correta') exit(1) if not isinstance(sha256, bool): print('Informe o parâmetro sha256 da forma correta, sendo um booleano') exit(1) mensagem_hash = 'SHA 256' if not sha256: mensagem_hash = 'MD5' if hash1 == hash2: print(f'Hash {mensagem_hash} OK - {hash1} = {hash2}') return True else: print(f'Hash {mensagem_hash} INCORRETO - {hash1} != {hash2}') return False def main(): """Função principal da aplicação que realiza o download de arquivos da internet """ arquivos = [['http://ftp.nl.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/mini.iso', 'mini.iso', 'D:\Instaladores\', '1deb3d465ead230e7a94390c1aea053945d37df84bd05125bd66cd998f5369b1'], ['https://releases.ubuntu.com/20.10/ubuntu-20.10-desktop-amd64.iso', 'ubuntu-20.10-desktop-amd64.iso', 'D:\Instaladores\', '3ef833828009fb69d5c584f3701d6946f89fa304757b7947e792f9491caa270e']] for arquivo in arquivos: print(f'Download do arquivo {arquivo}') download_do_arquivo(arquivo, arquivo) hash_sha256 = calcular_sha256(arquivo + arquivo) validar_hash(hash_sha256, arquivo) print('-=-') if __name__ == '__main__': main()
Fail2ban no Debian - Instalação e Configuração
Nmap - Comandos úteis para um administrador de sistemas Linux
Comando du - encontrando as maiores pastas e arquivos no Linux
Scikit Learn: Projetando o futuro de suas APIs e aplicativos usando machine learning
RapidScan - Multi-Tool WEB Vulnerability Scanner
Trabalhando com permutações em ordem lexicográfica crescente
Python: automatizando a extração de informações na web com expressões regulares
Desenvolvendo aplicações GUI simples em Python & Glade (PyGTK) com banco de dados SQLite
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (6)