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: 6.540 ]
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()
 Bloqueio de Países com IPTables
MultiCD - Diversas Distribuições no mesmo DVD/Pendrive
Taskwarrior, o Guerreiro das Tarefas - Gerenciar sua Lista TODO no Terminal
Criando um leitor de RSS com Python
Gerar Códigos QRCode com Python
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
copiar library para diretorio /usr/share/..... su com Falha na a... (1)
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (3)
Instalação dualboot Windows 11 e Debian 13 (29)









