为文件系统中的每个文件创建哈希值
我正在尝试写一个程序,这个程序可以为系统中的每个文件生成一个哈希值,不管是Windows、Linux还是Unix系统。然后,这个脚本会把生成的哈希值和一个已知的坏哈希值文件进行对比。如果文件系统中的某个哈希值和坏哈希值文件中的某个值匹配,就打印出有匹配的结果。有没有什么好的方法可以实现这个?
我刚学Python,想知道最有效的做法是什么。
3 个回答
0
首先,创建一个你想要检测的哈希值的集合:
badHash_set = set(['1234', 'abcd'])
然后在你想要检查的目录树的根目录上使用 os.walk:
http://docs.python.org/2/library/os.html#os.walk
for root, dirs, files in os.walk(base_path):
for file_str in files:
file_obj = file(os.path.join(root, file_str))
file_md5 = hashlib.md5(file_obj.read()).hexdigest()
if file_md5 in badHash_set:
# ...complain
不过,这个过程可能会非常慢。现在还不确定这会不会成为一个问题。
1
我写了一个模块,可以对一个文件夹及其子文件夹里的文件进行哈希处理。处理后的结果是一个以json格式呈现的树形结构。
pip3 install py_essentials
使用这个模块的方法如下:
from py_essentials import hashing as hs
hashtree = hs.createHashtree("path/to/the/directory/", 'sha1')
想了解更多关于这个功能的信息,可以查看文档。
下面是一个例子,展示了用json.loads()
和json.dumps()
打印出来的结果是什么样的。
{
"LICENSE": "1e69fdee9a5b6a177b20178014ffd56e0f64c417",
".gitignore": "182ba25cd720d7a2be1314927f9fa72604a9fda7",
"MANIFEST": "b7efe1149685a1e858b4a83242a5eefbe263e00e",
"README.md": "63b6fda48fd270e620a3defa9f960a1081d15132",
"setup.py": "81b0b4bcb7e9076986b7135c01dd1969aedfb256",
"setup.cfg": "7bc6f4c388d1e0409aee1f79c557b6ce3a3e9511",
"examples": {
"advancedList-example1.py": "615082e89704bce44b2b8a78b2738c590efcbf83"
},
"py_essentials": {
"fileHandler.py": "03611c13ab37a15d8d04e79711475114fe818a08",
"hashing.py": "5a7c77ecfa670309fb685a50ba75b1c9b2fbf161",
"checkup.py": "95743567715213d57f0e5e6cfbb42521c5a2b661",
"xcptns.py": "e053b7e4923ba270a7971624802efb32fd480ebb",
"simpleRandom.py": "a1ded44a7f707c2b0530e18a4f144665e9ad759a",
"__pycache__": {
"exceptions.cpython-36.pyc": "ec8c20db40523c09ee51616c4e1b250bb2a0825b",
"advancedList.cpython-36.pyc": "eeed573a2ec8187315f414e61cd5e6e083a5151d",
"hashing.cpython-36.pyc": "ea966ec926ed9516df7d332e45a6a411f88a3b7d",
"prettyPrinting.cpython-36.pyc": "c623260362e08ebfebf229681c357923eee85289",
"xcptns.cpython-36.pyc": "a2538519fd5fd37f67b73272a7077b93861589ca",
"__init__.cpython-36.pyc": "e25ee2a75c14026a2dc20170b1b3f8fe3f77069e",
"simpleRandom.cpython-36.pyc": "1968cf15b29472c855679c71dd5b862d5bec1d26",
"checkup.cpython-36.pyc": "982fb978040d168e888f6a389a259cc06d32d815",
"fileHandler.cpython-36.pyc": "0995fea9dfeae4740a77284a8eae19d9231c083f"
},
"advancedList.py": "41e9275662562da582326757cf3c9eb7bcc031dd",
"prettyPrinting.py": "b5244c76e5c33203b2d843705e62d1552b241db0",
"__init__.py": "5736a4b7e59efc4191665edb471a9282d2fd642e",
"test.py": "088d1b9786d5f4a3bf02f207a95b3b173cb636e2"
},
"dist": {
"py_essentials-1.4.11.tar.gz": "a8a7f93f1fe3aa263369e6b26fbafae6ed7dbd37",
"py_essentials-1.4.7.tar.gz": "8c4788c388d64bae1c740a21b200a9d95cf014d6",
"py_essentials-1.4.10.tar.gz": "e632e6093a1ceb602726e3c0848692b0d4205dd9",
"py_essentials-1.4.5.tar.gz": "a576e66b2f41a629d55ad585993b819bf3960d40",
"py_essentials-1.4.9.tar.gz": "bc6786fbeb5be254e5c05215779a3c37a427f398",
"py_essentials-1.4.6.tar.gz": "08f8dffdb57e7ee4aa99b0494f2b5ae529aae85a",
"py_essentials-1.4.8.tar.gz": "16c4fff88823c7900d3bb7ecfb489916315ca492"
}
}
之后,你可以递归地遍历这个树形结构,并将哈希值与一个坏哈希值的列表进行比较。
4
要在文件系统中遍历文件,可以使用 os.walk
这个工具。对于每个文件,你可以使用内置的库 hashlib
来创建一个哈希值。
下面是一个简单的示例:
import os, hashlib
current_dir = os.getcwd()
for root,dirs,files in os.walk(current_dir):
for f in files:
current_file = os.path.join(root,f)
H = hashlib.md5()
with open(current_file) as FIN:
H.update(FIN.read())
print current_file, H.hexdigest()