2008年10月12日 星期日

驗證檔案的內容

我們在很多網站下載檔案時,為了確保檔案內容沒有被修改過,通常檔案的提供者會提供你一組 MD5 或 SHA-1 之類的字串供你驗證,我把這個動作寫成一個 python script 來快速檢查:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hashlib
import os
import sys

def usage(app_name):
"""
The usage doc
"""
return """Usage: %s _filename_ _hash_algo_ _hash_value_"""

def main(args):
"""
Main program
"""
try:
f = open(args[0], 'r')
dig = getattr(hashlib, args[1])(f.read()).hexdigest()
f.close()
print (dig == args[2] and 'Valid') or 'Invalid'
except IOError, e:
print '找不到檔案 "%s"' % args[0]
except AttributeError, e:
print 'Hash 演算法名稱錯誤'

def commandline():
if len(sys.argv) > 2:
main(sys.argv[1:])
else:
print usage(sys.argv[0])

if __name__ == '__main__':
commandline()

簡單的使用方法就是 「script 檔名 演算法 驗證碼」,如果我將這個 script 存成一個叫 verify.py 的檔案,下載了一個 foo.dat 的檔案,要用 sha1 演算法檢查 abcdefg(假的,sha-1 的碼很長),那就這樣用:

verify.py foo.dat sha1 abcdefg

演算法直接用 python hashlib 裡支援的,如果不支援就會直接跳到 AttributeError :P

1 意見:

小白 提到...

你好,我在測試這個程式的時候,試了幾個檔案都發現算出來的md5還有sha1都不合,但是如果去用md5sum之類的程式去計算,結果又會符合。
所以想請問你看看,程式是不是可能哪裡發生了錯誤?