验证 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 的相同 OS)时,字节顺序不应颠倒。
iCrc32 = (int)crc32.getValue();
我希望这对这里的人有用。
我的 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 的相同 OS)时,字节顺序不应颠倒。
iCrc32 = (int)crc32.getValue();
我希望这对这里的人有用。