使用Busybox(Unix)获取Android设备中目录的SHA-1散列,使用Python获取本地机器不会返回相同的值
我试图在android上进行数据验证 我正在计算本地计算机上我的目录的sha-1,如下所示使用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
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哈希列表,这样排序就不重要了