реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> FTP сервер на STM-ке, подход к верификации данных
Danis
сообщение Nov 19 2014, 15:50
Сообщение #1


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Привет, коллеги!
Недавно поднял на STM32Fxx FTP сервер и удаленно через Internet пишу файлы во внешнюю flash память. Все неплохо работает, есть вопрос с подходом к верификации данных в принятых файлах. Я использую ftp passive mode, и по сути, аппаратно верифицируются только пакеты пришедшие с Ethernet, можно конечно и проверить пакет после записи на SD. Но этого не достаточно для полного убеждения о целостности файла. Я тут вижу два пути, сначала записать удаленно файл, и скачать обратно, сравнить их Hash (долго, если файл большой). Второй, научить STM-ку считать Hаsh уже записанных файлов по команде (возможно не стандартной) FTP и создавать *.txt файл с Hаsh суммами файлов в текущей директории. После чего можно скачать этот файл и проверить. Но наверняка, есть более красивый и правильный подход, которого я не знаю, так что буду рад подсказке, спасибо!


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 19 2014, 16:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



CRC32 вполне достаточно в этом случае.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 19 2014, 16:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Ну да, если файл передаётся через интернет, то контрольная сумма TCP слабовата. Если файл требует защиты, то пусть закачивают пару файлов: данные и контрольную сумму.
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 19 2014, 17:14
Сообщение #4


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(scifi @ Nov 19 2014, 19:23) *
Ну да, если файл передаётся через интернет, то контрольная сумма TCP слабовата. Если файл требует защиты, то пусть закачивают пару файлов: данные и контрольную сумму.


У меня со стороны FTP клиента сидит человек (пока), возможно будет «сидеть» и машина, а со стороны FTP сервера «железка» STM32, она и использует файлы, без человека. Вот смысла закачки файла с контрольной суммой пока недопонимаю, если честно... наверное, это будет уместно, если человек со стороны сервера вытащит флешку и сверит. А так, идею понял, спасибо.

Цитата(jcxz @ Nov 19 2014, 19:15) *
CRC32 вполне достаточно в этом случае.

Ну уж очень лаконично. Да, в моем случае в контроллер входит аппаратный модуль CRC32, им часто пользуюсь, очень шустрый.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 19 2014, 17:48
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Danis @ Nov 19 2014, 17:50) *
Но этого не достаточно для полного убеждения о целостности файла.


Подключите SSL. Этого будет достаточно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 19 2014, 20:46
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Вот смысла закачки файла с контрольной суммой пока недопонимаю, если честно...


ну я так понимаю реализация может быть такая

вы шлете файл, и второй файл со значением хитро посчитанной контрольной суммы. На стороне проца, для каждого файла проц считает по тому же алгоритму хитрую контрольную сумму и сверяет со значением во втором файле. Если все ок, считает файл достоверным. То есть это ваш вариант с хэш кодом, только не надо команды на пересыл контрольной суммы обратно, доставьте ее процу.

Но меня интересует вот что, ТСР уже снабжено неплохой контрольной суммой, причем не на весь файл а на каждый пакет. Неужели ее катастрофически не хватает?
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Nov 19 2014, 21:10
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(Golikov A. @ Nov 19 2014, 16:46) *
вы шлете файл, и второй файл со значением хитро посчитанной контрольной суммы.

А почему нельзя хитрую контрольную сумму поместить в первый файл?


--------------------
ASB
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 02:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Nov 20 2014, 02:46) *
Но меня интересует вот что, ТСР уже снабжено неплохой контрольной суммой, причем не на весь файл а на каждый пакет. Неужели ее катастрофически не хватает?

Вы считаете x0+x1+...+xN (ну плюс ещё переносы из старших разрядов) неплохим контролем?
Хм.... и зачем тогда люди CRC считают, мучаются?... непонятно....

Цитата(Aleksandr Baranov @ Nov 20 2014, 03:10) *
А почему нельзя хитрую контрольную сумму поместить в первый файл?

Непонятно, что автор контролировать хочет.
Если - достоверность полученного файла на сервере, то очевидное решение - просто пристыковать CRC32 к концу файла (+4 байта к длине), а на приёмном конце проверить.
Если - контроль со стороны отправителя, что получатель получил корректный файл - инфу и принятом файле (имя+длина+CRC32) отправить обратно к клиенту. Любым удобным способом (хоть рядом файл создать, хоть через другой сокет и т.п.).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 20 2014, 05:54
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
А почему нельзя хитрую контрольную сумму поместить в первый файл?


потому что не понятно как будет использоваться файл, может формат жестко задан. Но в целом верно то что сказал jcxz не понятно контроль чего нужен...


Цитата
Вы считаете x0+x1+...+xN (ну плюс ещё переносы из старших разрядов) неплохим контролем?

да, потому что XOR по 8 битам считаю плохим, а этот считаю не плохим... не супер, но не плохим...


кстати еще хорош стандартный метод, зажать выходной файл зипом, передать, а на приемной стороне разархивировать. Тем самым выполняются оба контроля. Архивированный файл содержит внутри контрольную сумму, если он разархивировался значит и был передан правильно, и приемная сторона узнает что сумма сошлась.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 07:35
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Nov 20 2014, 11:54) *
кстати еще хорош стандартный метод, зажать выходной файл зипом, передать, а на приемной стороне разархивировать. Тем самым выполняются оба контроля. Архивированный файл содержит внутри контрольную сумму, если он разархивировался значит и был передан правильно, и приемная сторона узнает что сумма сошлась.

Ну да, реализовать на удалённой системе поддержку распаковки ZIP-формата. А потом ещё и дорабатывать это каждый раз, как в ZIP-формат вводятся какие-то нововведения (новые методы сжатия и т.п.).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 20 2014, 07:42
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я может ошибаюсь, но вроде бы для распаковки предоставлялась библиотека. Давным давно так было сделано обновление прошивки в каком-то продукте. Он заливался по RS232 и zip здорово помогал в ускорении процесса, а так же проверял целостность. Так вот как паковать - это супер мего тайна фирмы производящей архиватор, это их конкурентное преимущество, а как распаковывать было открыто и то ли исходники кода давали, то ли библиотеку, я не очень помню, но помню что проблем с распаковкой вообще не было.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 09:01
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Nov 20 2014, 13:42) *
Так вот как паковать - это супер мего тайна фирмы производящей архиватор, это их конкурентное преимущество, а как распаковывать было открыто и то ли исходники кода давали, то ли библиотеку, я не очень помню, но помню что проблем с распаковкой вообще не было.

Время течёт, всё меняется. И вот уже в формат ZIP добавили например AES. И если запаковать с ним, то никакая старая либа такое не распакует.
Конечно это опционально и при паковке это можно не включать. Но всё-же всё-же.... Зачем себе усложнять жизнь?
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 20 2014, 09:04
Сообщение #13


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Коллеги, большое спасибо за идеи и рассуждения. Думаю это полезно не только для меня. Не стал сильно сразу расписывать задачу, чтоб не засорять. Со стороны клиента файлы пока передает человек, это не картинки и не музыка, а созданный пакет файлов, например бинарники и другие форматы подготовленные для обработки удаленной «железкой», поэтому есть свобода, и действительно идея прописать внутрь файла hash мне нравится. После загрузки файла можно сразу ее пересчитать или даже на ходу по блокам после записи и чтения с SD. Тогда можно будет светси к минимуму напряжения оператора, что будет их «заливать» удаленно. И по приему 226 transfer complete можно будет судить, что файл записан и верифицирован.
В примере *.dvc3 это формат шифрованной прошивки для обновления firmware в нашей компании.

Код
Статус:    Соединяюсь с 176.226.243.83:201...
Статус:    Соединение установлено, ожидание приглашения...
Ответ:    220 Welcome to DaNiS FTP Server
Команда:    USER Murena
Ответ:    331 User name okay, need password
Команда:    PASS ******
Ответ:    230 Login successful.
Команда:    SYST
Ответ:    215 UNIX Type: L8 Internet Component Suite
Команда:    FEAT
Ответ:    500 Syntax error, command unrecognized
Статус:    Соединение установлено
Статус:    Получение списка каталогов...
Команда:    CWD /
Ответ:    250 CWD command successful
Команда:    PWD
Ответ:    257 "/" is current directory.
Команда:    TYPE I
Ответ:    200 Switching to Binary mode.
Команда:    PASV
Ответ:    227 Entering Passive Mode (176,226,243,83,0,200)
Команда:    LIST
Ответ:    150 Opening BINARY mode data connection for /bin/ls
Ответ:    226 transfer complete, data port is closed
Статус:    Список каталогов извлечен
Статус:    Начинаю закачивать E:\KTM4_v64_35_test_U3_ftp.dvc3
Команда:    CWD /DanFolder002
Ответ:    250 CWD command successful
Команда:    PWD
Ответ:    257 "/" is current directory.
Команда:    PASV
Ответ:    227 Entering Passive Mode (176,226,243,83,0,200)
Команда:    STOR KTM4_v64_35_test_U3_ftp.dvc3
Ответ:    150 File status okay; about to open data connection.
Ответ:    226 transfer complete, data port is closed
Статус:    Файл передан успешно, передан 263 462 байт в 3 секунды


Простой проверке CRC32 пакетов, что приходят по TCP я не верю, у меня был случай, когда я скачивал дистрибутив Mplab с сайта Микрочип, после скачки установка «падала», когда я скачал этот же дистрибутив с другого места, все стало ОК. Я сравнил эти два одинаковых файла по 105 MB утилитой «file compare» и нашел 9 байт в разных местах, которые отличались, распечатал и «сунул в нос» провайдеру, через неделю извинились и что то поменяли, стало нормально.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 09:41
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Danis @ Nov 20 2014, 15:04) *
Простой проверке CRC32 пакетов, что приходят по TCP я не верю, у меня был случай, когда я скачивал дистрибутив Mplab с сайта Микрочип

Где-ж Вы в TCP нашли CRC32???
Почитайте его описание.
Go to the top of the page
 
+Quote Post
WitFed
сообщение Nov 20 2014, 10:11
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



Про TCP я читал очень давно, как там дополнительно контролируется содержимое внутри уже проверенного внешним CRC32 пакета, но CRC32 вполне себе очень доверятельная вещь !
По инету всё им проверяется на вшивость, мужики очень умные придумывали. И просто, и надёжно.
Там на каждый единичный бит в исходном файле к 4-байтному результату XOR-ится уникальное 32-битное число, и если бит/байт или их группа рядом где-то испортится, как обычно бывает в импульсных глюках, то проксорится уже другая цепочка, и вероятность получить тот же код невероятно мала. Для получения той же CRC32 для других данных нужен очень мощный перебор.
Происходит вычурная однозначная трансляция из всего множества файлов разных длин в множество 32-битных чисел, которая, естественно, может несколько файлов отобразить в одно и то же число, но на практике это не бывает, особенно если несколько байт изменено, а остальные прежние.
Вообще, я считаю, что нужно сначала ошибку увидеть, а потом её начинать бояться, солому стелить как-то... Флэшь тоже может сбоить -- вот там нужны CRC32 в каталоге для каждого файла или даже у каждого сектора, как раньше было у HDD.
А у провайдера кэш глючил на прокси (ОЗУ/винт SSD), скорей всего -- они файл получили, куда-то сохранили, потом считали побитый, на пакеты порезали, новой CRC32 закрыли -- и передали, типа "усё хоккей".
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.03585 секунд с 7
ELECTRONIX ©2004-2016