2015-12-02 88 views
0

我的Android应用程序从我的服务器下载数据作为文件。验证Android和PHP之间的文件数据完整性

我想验证在传输过程中文件内容没有被篡改过。

此时,我想使用服务器上生成的CRC32值,并通过安全连接将其传输到Android客户端。

但是,PHP中生成的值与Android客户端生成的值不同。这里是我如何计算在PHP中CRC32值:

$Crc32 = hash_file('crc32b', $output_file); 

这里是我的代码生成的Android:

boolean bOk = true; 
File fTarget = null; 
FileInputStream fis; 
CRC32 crc32; 
byte[] btData; 
int iCount; 
int iCrc32; 
String strCrc32; 

btData = new byte[1024]; 
crc32 = new CRC32(); 

try 
{ 
    fTarget = new File(DOWNLOAD_TARGET_PATH); 
    fis = new FileInputStream(fTarget); 

    while((iCount = fis.read(btData)) != -1) 
    { 
     crc32.update(btData, 0, iCount); 
    } 
    fis.close(); 
} 
catch(Exception e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

iCrc32 = Integer.reverseBytes((int)crc32.getValue()); 
strCrc32 = String.format("%08x", iCrc32); 
bOk = strCrc32.contentEquals(data.m_strCrc32); 

if(!bOk && fTarget != null) 
{ 
    // delete the file as it could be dangerous 
    fTarget.delete(); 
} 
return bOk; 

我倒字节顺序,在调试过程中,我看到它没有比赛。

在调试版本中一切正常,但是当我创建发布版本时,它不起作用。

这样做的正确方法是什么?

+0

'在调试版本中一切都很好,但是当我创建发布版本时,它不起作用。'。那没有意义。 – greenapps

+0

什么是$ output_file?你是否检查过文件大小是否与发送的大小相等? – greenapps

+0

我们无法看到您的PHP脚本如何回响$ Crc32。我们也不能看到你如何收到并存储它。只需将一个已知的句子放在$ output_file中,然后告诉所有的值。提供完整的代码,以便我们可以测试和比较。 – greenapps

回答

1

下面是问题的解决方案:字节顺序!

就我而言,我使用Windows服务器进行开发,生产服务器是Linux。这意味着,当计算CRC32值时,字节顺序是重要的。

因此,当服务器是Windows,扭转了字节顺序是正确的:

iCrc32 = Integer.reverseBytes((int)crc32.getValue()); 

但是,当服务器是Linux操作系统(在其Android是建立在相同的操作系统),字节顺序不应该被逆转。

iCrc32 = (int)crc32.getValue(); 

我希望这会对这里的某些人有用。