Мое приложение Android загружает данные в виде файла с моего сервера.
Я хочу убедиться, что содержимое файла не было изменено во время передачи.
В этот момент я подумал об использовании значения CRC32, сгенерированного на сервере и переданного клиенту Android через безопасное соединение.
Однако значение, сгенерированное в PHP, отличается от значения, сгенерированного на клиенте Android. Вот как я вычисляю значение CRC32 в PHP:
$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();
Я надеюсь, что это будет полезно кому-то здесь.
Других решений пока нет …