我试图在android上进行数据验证,
我正在计算本地机器上我的目录的 sha-1,如下所示,
def getLocalFoldersChecksum(directory):
directory = '/.../test-assets/testoswalk'
SHAhash = hashlib.sha1()
print SHAhash.hexdigest()
if not os.path.exists (directory):
return -1
try:
for root, dirs, files in os.walk(directory):
for names in files:
filepath = os.path.join(root,names)
try:
f1 = open(filepath, 'rb')
except:
# You can't open the file for some reason
f1.close()
continue
SHAhash.update(hashlib.sha1(f1.read()).hexdigest())
f1.close()
except:
return -1
return SHAhash.hexdigest()
我得到了Android设备上目录的Sha-1(使用Busybox),如下所示,
BUSY_BOX = "/data/local/tmp/busybox"
def getDeviceFoldersChecksum(directory):
cmd = BUSY_BOX + ' find /mnt/sdcard/testoswalk -type f -exec ' + BUSY_BOX +
' sha1sum {} \; | ' + BUSY_BOX + ' sort | ' + BUSY_BOX + ' sha1sum '
checksum = device.shell(cmd)
return checksum
但是这两个函数返回的值不匹配。
我尝试类似地检查 Android 和本地机器中文件的 Sha-1,并且效果很好,
def getFilesChecksum():
ck1 = hashlib.sha1(open('/.../test-assets/testoswalk/abc.xml').read()).hexdigest()
cmd = BUSY_BOX + ' sha1sum /mnt/sdcard/testoswalk/abc.xml'
ck2 = device.shell(cmd)
ck2 = ck2.split(' ')[0]
if(ck1 == ck2):
return True
return False
我确信问题在于文件在目录中的排序方式和 Sha-1 使用的方式,我尝试了各种排列但没有运气。谢谢您的帮助。
分辨率如下,
使用 adb shell 在 android 设备上计算 SHA-1,如下所示,
$ rm -f SHA1SUMS
$ /data/local/tmp/busybox find /mnt/sdcard/testoswalk -type f -print0 | /data/local/tmp/busybox xargs -0 /data/local/tmp/busybox sha1sum >> SHA1SUMS
$ /data/local/tmp/busybox cut -c-40 SHA1SUMS | /data/local/tmp/busybox sha1sum
并使用 python 在本地计算机上计算 SHA-1,如下所示
def getLocalFoldersChecksum(directory):
directory = '/.../test'
SHAhash = hashlib.sha1()
print SHAhash.hexdigest()
try:
f = open('/.../test/SHA1SUMS','w')
except:
return -1
if not os.path.exists (directory):
return -1
try:
for root, dirs, files in os.walk(directory):
for names in files:
filepath = os.path.join(root,names)
try:
f1 = open(filepath, 'rb')
except:
# You can't open the file for some reason
f1.close()
continue
f.write(hashlib.sha1(f1.read()).hexdigest())
f.write('\n')
f1.close()
except:
return -1
f.close()
f = open('/.../test/SHA1SUMS','rb')
t = hashlib.sha1(f.read()).hexdigest()
f.close()
return t