У меня есть форма (сделанная в reactJS), и мне нужно запросить подпись пользователя. насколько я могу судить, все существующие решения зависят от браузера для создания того, что по сути является файлом в base64. Для меня это создает проблему безопасности, поскольку любой может на стороне клиента предоставить свой собственный файл вместо сгенерированного, что может привести к загрузке вирусов и тому подобного. У меня нет возможности передать его через антивирус или другие подобные решения. Есть ли способ проверить это на стороне сервера? или какой-то совсем другой подход к этому?

Благодарность

1
elitzur e 16 Апр 2020 в 12:31

1 ответ

Вы запрашиваете серверную часть проверки файла без загрузки самого файла, это на самом деле невозможно буквально, но можно подумать о некоторых творческих подходах к этому, например SHA 256 проверка файла, закодированного в base64, на стороне клиента с использованием некоторой связанной библиотеки js например js-sha256:

  1. На стороне клиента: файл подписи пользователя с именем signal.sig со следующим содержимым: SignatureFile1234567890
  2. На стороне клиента: кодировка base64 этого файла: U2lnbmF0dXJlRmlsZTEyMzQ1Njc4OTA=
  3. Клиентская сторона: sha256 приведенной выше строки base64 (сгенерирована с использованием js-sha256): 2bdb56a39b4ea7f5831740e0d0b6d2b13a462e4ed5c9145594a6635e76562010
  4. На стороне сервера: отправить клиенту хэш sha256 файла подписи, хранящегося на сервере
  5. Клиентская сторона: проверить оба хэша

Конечно, это проверка целостности, подверженная конкретным уязвимостям библиотеки и выбранным коллизиям алгоритма хеширования, и вы сделаете хэш подписи доступным на стороне клиента.

0
gl4ssiest 16 Апр 2020 в 18:34
Это хорошая идея, но на самом деле, поскольку все на стороне клиента, как вы сказали, это единственная целостность. «хакер» может просто выбрать свой собственный файл еще до начала проверки, и тогда все, что я буду проверять, это файл, который он выбрал. нет?
 – 
elitzur e
16 Апр 2020 в 19:28
Да, злоумышленник может подделать свои собственные файлы, но чтобы найти правильный файл, соответствующий хэшу исходного файла, потребуется 2ˆ256 попыток, так называемая коллизия хэшей (с использованием SHA-256).
 – 
gl4ssiest
17 Апр 2020 в 17:19
Но опять же, исходный файл динамически создается пользователем по мере того, как он создает свою собственную подпись. поэтому значение хеш-функции будет каждый раз разным. я что-то пропустил?
 – 
elitzur e
18 Апр 2020 в 20:28
Пользователь должен каждый раз генерировать новую подпись? Если это так, то это не подпись, а файл, действующий как своего рода токен, в этом случае сервер и клиент должны согласовать некоторые начальные данные, чтобы файл можно было проверить. Если файл будет сгенерирован только один раз, то хэш будет одинаковым каждый раз, когда пользователь его использует, в этом случае этот файл подписи должен быть загружен на сервер, чтобы его можно было проверить. В обоих случаях использование хэша позволит избежать загрузки файлов при каждом взаимодействии с пользователем, как вы просили.
 – 
gl4ssiest
18 Апр 2020 в 23:01
Можете ли вы привести пример первого сценария того, как этого добиться?
 – 
elitzur e
20 Апр 2020 в 20:23