Примечание. Это репост исходного сообщения в блоге во время GSoC ’17. Когда мой экземпляр AWS вышел из строя, я перенес сюда свои старые записи в блоге.
Первоначально опубликовано в июле 2017 г.
Этот пост в блоге подводит итоги восьмой недели написания кода с открытым исходным кодом для Drupal с помощью Google Summer of Code.
На этой неделе я почти завершил окончательный JS-скрипт шифрования и перешел к расшифровочной части модуля, который является последним основным функциональным компонентом.
Обновления шифрования файлов
Я добавил настраиваемое поле в форму для ввода файлов, которые будут принимать все типы файлов для ввода пользовательского файла, который должен быть зашифрован этим модулем.
Было несколько ограничений на использование поля ввода файла по умолчанию, так как это потребовало бы дополнительной настройки от системного администратора, типы файлов, которые можно загрузить, также ограничены, и существуют методы JS, которые привязаны к событию изменения этих полей, не переопределяемых event.preventDefault().
Я также добавил новые методы AJAX, которые будут асинхронно отправлять файл на серверную часть, используя объекты FormData()API и BLOB в JavaScript, чтобы имитировать поле формы, что лучше и элегантнее, чем то, что было у меня. используя перед:
Раньше:
var body = ‘ — ‘ + border + ‘\r\n’
// Имя параметра — «file», локальное имя файла — «temp.txt»
+ ‘Content-Disposition: form-data; имя="файл";’
+ ‘имя_файла=’’ + имя_файла + ‘“\r\n’
// Добавляем MIME-тип файла
+ ‘Content-type: ‘ + file.type + ‘\r\n\r\n’
// Добавьте свои данные:
+ зашифровано + ‘\r\n’
+ ‘ — ‘+ граница + ‘ — ‘;
В настоящее время:
var formData = new FormData();
formData.append('файл', новый файл([новый большой двоичный объект([зашифрованный])], имя_файла));
formData.append('другое-поле-формы', 'какое-то значение');
Песочница для расшифровки файлов
Я начал тестировать свои сценарии расшифровки в песочнице расшифровки. В целях тестирования я добавил метод загрузки для события, когда файл выбран на новой странице узла. Я также добавил еще одно поле файла на той же странице, чтобы проверить расшифровку на той же странице.
Итак, теперь, как только вы выберете файл в поле «Зашифрованный файл», он загрузит файл зашифрованного текста с именем зашифрованное_имя_файла.расширение, и этот файл затем можно будет перетащить в поле «Расшифровать файл», и это расшифрует этот файл и загрузит текстовый файл для этого файла. Это работало, как и ожидалось, для простых текстовых файлов, но изначально не совсем работало для двоичных файлов, таких как изображения.
Результат с бинарниками:
Проблемы с бинарниками!
Как упоминалось на предыдущем изображении, двоичные файлы (например, изображения) не работали с написанным мной JS-кодом. Оказалось, что я использовал неправильное декодирование при расшифровке файла, так как шифрование прошло нормально. Однако библиотека CryptoJS автоматически обрабатывает кодировку base64.
Вот как выглядело исходное изображение при открытии в текстовом редакторе:
Но вывод файла, который я получал, был в другом наборе символов:
База64:
Base64 не преобразован с использованием .toString(CryptoJS.enc.Latin1)
После некоторого поиска в Интернете я понял, что мне нужно загрузить двоичные файлы, используя тип MIME «data:application/octet-stream» на якоре с тегом «загрузка» и триггерным нажатием. на нем с помощью JS.
Кроме того, я мог бы добавить на страницу превью изображения, показывающего, как работает этот сайт во время расследования.
После небольшой модификации я смог заставить это работать со всеми типами MIME и протестировал его с обычным текстом, изображениями и файлами PDF, а затем переместил этот код в ветку js_decrypt, чтобы прикрепить его ко всем страницам, где эти зашифрованные файлы будут отображаться. .
Видеозапись экрана Youtube, демонстрирующая песочницу расшифровки.
https://www.youtube.com/watch?v=I-eDFPVlAGc
Кроме того, на этой неделе будет второй этап оценки, и эта неделя станет концом второго месяца периода кодирования в Google Summer of Code. Поскольку большая часть времени уже прошла, разработка большинства основных частей модуля продолжается. Осталось только настроить реализованные функции и написать тесты и документацию. Я начал изучать написание тестов, которые я собираюсь продолжить на этой неделе, а также изменить методы предварительного просмотра файлов на страницах просмотра статей. [Еще что нужно добавить после завтрашней встречи]
Спасибо за чтение!