2015-12-02 2 views
0

Приложение для Android загружает данные как файлы с моего сервера.Проверка целостности данных файла между Android и PHP

Я хочу проверить, не было ли изменено содержимое файла во время передачи.

На данный момент я думал об использовании значения 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

«Все отлично работает в сборке отладки, но когда я создаю сборку выпуска, это не работает». Это не имеет смысла. – greenapps

+0

Что такое $ output_file? Вы отметили, что размер файла равен отправляемому? – greenapps

+0

Мы не можем видеть, как ваш php-скрипт echos $ Crc32. Мы также не видим, как вы его получите и сохраните. Просто поставьте известное предложение в $ output_file, а затем сообщите все значения. Поставьте полный код, чтобы мы могли тестировать и сравнивать. – greenapps

ответ

1

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

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

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

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

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

iCrc32 = (int)crc32.getValue(); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^