Skip to content Skip to sidebar Skip to footer

Python Compare Local And Remote File Md5 Hash

I am trying to compare Local and remote file MD5 hash (the same file i copy/paste in my wamp 'www' directory), but I don't understand why the 'checksums' are not corresponding... H

Solution 1:

So thanks to helpers here's the final code working :

#-*- coding: utf-8 -*-import hashlib
import requests

defmd5Checksum(filePath,url):
    m = hashlib.md5()
    if url==None:
        withopen(filePath, 'rb') as fh:
            m = hashlib.md5()
            whileTrue:
                data = fh.read(8192)
                ifnot data:
                    break
                m.update(data)
            return m.hexdigest()
    else:
        r = requests.get(url)
        for data in r.iter_content(8192):
             m.update(data)
        return m.hexdigest()

print"checksum_local :",md5Checksum("projectg715gb.pak",None)
print"checksum_remote :",md5Checksum(None,"http://testpangya.ddns.net/projectg715gb.pak")

Solution 2:

Ok looks like i found a solution so i will post it here :)

First you need to edit an .htaccess file to the directory where your files are on your server.

Content of the .htaccess file :

ContentDigest On

Now that you have set up this the server should send Content-MD5 data in HTTP header.

It will result in something like :

'Content-MD5': '7dVTxeHRktvI0Wh/7/4ZOQ=='

Ok now let see Python part, so i modified my code to be able to compare this HTTP header data and local md5 Checksum.

#-*- coding: utf-8 -*-import hashlib
import requests
import base64

defmd5Checksum(filePath,url):
    m = hashlib.md5()
    if url==None:
        withopen(filePath, u'rb') as fh:
            m = hashlib.md5()
            whileTrue:
                data = fh.read(8192)
                ifnot data:
                    break
                m.update(data)
            #Get BASE 64 Local File md5return base64.b64encode(m.digest()).decode('ascii')#Encode MD5 digest to BASE 64else:
        #Get BASE 64 Remote File md5
        r = requests.head(url) #You read HTTP Header herereturn r.headers['Content-MD5'] #Take only Content-MD5 stringdefcompare():
    local = md5Checksum("projectg502th.pak.zip",None)
    remote = md5Checksum(None,"http://127.0.0.1/md5/projectg502th.pak.zip")

    if local == remote :
        print("The soft don't download the file")
    else:
        print("The soft download the file")

print ("checksum_local :",md5Checksum("projectg_ziinf.pak.zip",None))
print ("checksum_remote : ",md5Checksum(None,"http://127.0.0.1/md5/projectg_ziinf.pak.zip"))

compare()

Output :

checksum_local :7dVTxeHRktvI0Wh/7/4ZOQ==checksum_remote :7dVTxeHRktvI0Wh/7/4ZOQ==Thesoftdon'tdownloadthefile

I hope this will help ;)

Solution 3:

Thanks for posting your solution https://stackoverflow.com/users/7495742/framb-axa

Was super helpful for my issue.

I slightly revised the md5 part and print statements for python3 and swapped them to use sha256 for my use and it works awesome for my needs to download/check a local and remote sqlite DB for an app i built. Leaving code here as well in as a reference for anyone else who might stumble on this post as well.

import hashlib
import requests


# current release version url
current_release_url = 'https://somedomain.here/current_release.txt'
current_release_notes_url = 'https://somedomain.here/current_release_notes.txt'# current database release  version url
current_db_release_url = 'https://somedomain.here/current_db_release.txt'
current_db_release_notes_url = 'https://somedomain.here/current_db_release_notes.txt'
current_db_release_notes_hash_url = 'https://somedomain.here/current_db_release_hash.txt'
current_db_release = ''
wizard_db_version = ''# Default commands DB url
wizard_cmd_db_url = 'https://somedomain.here/sqlite.db'

wizard_cmd_db = 'some/path'

checksum_local = ''
checksum_remote = ''
checksum_remote_hash = ''
checksum_status = ''defdownload_cmd_db():
    try:
        print('Downloading database update version: ' + str(current_db_release))
        url = wizard_cmd_db_url
        r = requests.get(url)
        withopen(wizard_cmd_db, 'wb') as f:
            f.write(r.content)

        # Retrieve HTTP meta-dataprint(r.status_code)
        # print(r.headers['content-type'])# print(r.encoding)
        settings.setValue('wizard_db_version', current_db_release)
        print('Database downloaded to:' + str(wizard_cmd_db))
    except:
        print('Commands Database download failed.... ;( ')


defsha256_checksum(filepath, url):
    m = hashlib.sha256()
    if url isNone:
        withopen(filepath, 'rb') as fh:
            m = hashlib.sha256()
            whileTrue:
                data = fh.read(8192)
                ifnot data:
                    break
                m.update(data)
            return m.hexdigest()
    else:
        r = requests.get(url)
        for data in r.iter_content(8192):
            m.update(data)
        return m.hexdigest()


defwizard_db_hash_check():
    global checksum_local, checksum_remote, checksum_status
    try:
        checksum_local = sha256_checksum(wizard_cmd_db, None)
        checksum_remote = sha256_checksum(None, wizard_cmd_db_url)
        print("checksum_local : " + checksum_local)
        print("checksum_remote: " + checksum_remote)
        print("checksum_remote_hash: " + checksum_remote_hash)

        if checksum_local == checksum_remote_hash:
            print('Hash Check passed')
            checksum_status = Trueelse:
            print('Hash Check Failed')
            checksum_status = Falseexcept:
        print('Could not perform wizard_db_hash_check')


# Sanity check for missing database file
file = pathlib.Path(wizard_cmd_db)
if file.exists():
    print("DB File exists: " + wizard_cmd_db)
    wizard_db_hash_check()
else:
    print("DB File does NOT exist: " + wizard_cmd_db)
    download_cmd_db()
    wizard_db_hash_check()

# Check hash# # Logic to decide when to download DB heretry:
    ifint(current_db_release) > int(wizard_db_version):
        print('Database update available: ' + str(current_db_release))
        download_cmd_db()
        wizard_db_hash_check()
except:
    print('Unable to check wizard_db_release')

if checksum_local != checksum_remote:
    download_cmd_db()
    wizard_db_hash_check()

# Logic to fallback to default packaged DB if no internet to download and compare hashif checksum_status isTrue:
    target_db = str(wizard_cmd_db)
else:
    print('All hash checks and attempts to update commands DB have failed. Switching to bundled DB')
    target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite.db")

print('Sanity Checks completed')

Post a Comment for "Python Compare Local And Remote File Md5 Hash"