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.508 ]
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()
Padrões Abertos e Interoperabilidade na Geotecnologia
Como executar tarefas a cada 5, 10 ou 15 minutos
Taskwarrior, o Guerreiro das Tarefas - Gerenciar sua Lista TODO no Terminal
Gerar senhas seguras com Python
Como criar um bot para curtir e comentar perfis do Instagram
Introdução ao clib (Command Line Book)
Qu1cksc0pe - All-in-One Static Malware Analysis Tool
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
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Problemas com Driver NVIDIA (0)
Programa fora de escala na tela do pc (19)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)









