Проверка целостности данных файла между Android и Stack Overflow

Мое приложение 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;

Я перевернул порядок байтов, так как во время отладки я увидел, что он не совпадает.

Все отлично работает в отладочной сборке, но когда я создаю релизную сборку, она не работает.

Как правильно это сделать?

0

Решение

Вот решение проблемы: Порядок байтов!

В моем случае я работаю с сервером Windows, а мой рабочий сервер — Linux.
Это означает, что при вычислении значений CRC32 важен порядок байтов.

Поэтому, когда сервером является Windows, обратный порядок байтов является правильным:

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

Но когда сервером является Linux (та же ОС, на которой построен Android), порядок следования байтов не должен меняться.

iCrc32 = (int)crc32.getValue();

Я надеюсь, что это будет полезно кому-то здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]