Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Busybox(Unix)获取Android设备中目录的SHA-1散列,使用Python获取本地机器不会返回相同的值_Android_Python_Sha1_Monkeyrunner_Busybox - Fatal编程技术网

使用Busybox(Unix)获取Android设备中目录的SHA-1散列,使用Python获取本地机器不会返回相同的值

使用Busybox(Unix)获取Android设备中目录的SHA-1散列,使用Python获取本地机器不会返回相同的值,android,python,sha1,monkeyrunner,busybox,Android,Python,Sha1,Monkeyrunner,Busybox,我试图在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

我试图在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()
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
$ 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
我在Android设备(使用Busybox)上得到了目录的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()
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
$ 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
但是这两个函数返回的值不匹配

我也试着在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使用的方式,我尝试过各种排列,但没有成功。谢谢你的帮助


决议如下:

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()
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
$ 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
使用adb外壳在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()
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
$ 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

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

或者,使用交换函数组合SHA1哈希列表,这样排序就不重要了