繁体   English   中英

验证Android和PHP之间的文件数据完整性

[英]Verfying file data integrity between Android and PHP

我的Android应用程序从服务器下载数据作为文件。

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

此时,我想到了使用服务器上生成的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;

我将字节顺序颠倒了,因为在调试期间,我发现它不匹配。

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

正确的方法是什么?

解决问题的方法如下:字节顺序!

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

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

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

但是,如果服务器是Linux(与构建Android的操作系统相同),则字节顺序不应颠倒。

iCrc32 = (int)crc32.getValue();

我希望这对这里的人有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM