1

我试图在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
4

1 回答 1

0

首先,如果您只将文件名保留在您在设备上生成的 SHA1 列表中,那么您的所有问题都会消失。另一种解决方案是确保相同的顺序,例如,在将它们组合成一个之前,通过排序函数运行 SHA1 哈希。

或者,使用交换函数来组合 SHA1 哈希列表,这样排序就无关紧要了。

于 2013-10-23T18:56:19.543 回答