Безопасность и конфиденциальность — это одни из самых актуальных тем на сегодняшний день. Это заставляет нас еще раз пересмотреть подходы к безопасности. И, как всегда, все зависит от оптимального баланса — удобства и факторов риска. Сегодня мы попытаемся найти формулу их оптимального соотношения.
Приложение, которое мы собираемся сегодня создать — это эксперимент. Оно позволит пользователям выбирать на своих компьютерах файлы и шифровать их на стороне клиента с использованием кода доступа.
Нет, в серверном коде необходимости не будет, никакая информация между клиентом и сервером передаваться не будет. Чтобы сделать это, мы будем использовать HTML5 FileReader API , и библиотеку шифрования JavaScript — CryptoJS .
Обратите внимание, что приложение будет шифровать не сам файл, а его копию, так что оригинал в любом случае у вас сохранится.
Но прежде чем мы начнем, вот несколько проблем и ограничений, с которыми нам придется столкнуться:
Шифруем файлы с помощью Python
Проблемы и ограничения
Лимит в 1 Мб
Если вы попробуете поработать с демонстрационной версией, то заметите, что она не позволяет шифровать файлы размером более 1 МБ. Я установил такой лимит, потому что атрибут HTML5 download , который я использую для запроса на загрузку файла для шифрования, не слишком хорошо работает с большими объемами данных.
При загрузке больших файлов текущая вкладка в браузере Google Chrome просто зависает, при использовании Firefox вылетает весь процесс браузера.
Способом решить эту проблему могло бы стать использование File System API и запись в нем двоичных данных, но на данный момент это приложение поддерживается только в Google Chrome.
Причем, на скорости шифрования файла размер не сказывается, это проблема только для возможности скачивания файлов.
Как насчет HTTPS?
Когда речь идет о шифровании данных и обеспечении конфиденциальности информации, люди, естественно, ожидают, что страницы должны загружаться через HTTPS . В данном случае я считаю, что необходимости в этом нет.
Так как кроме стартовой загрузки HTML и активных элементов, данные между вами и сервером не передаются — все делается на стороне клиента с помощью JavaScript. Если это все же беспокоит вас, вы можете просто скачать демо-версию и запустить ее прямо на вашем компьютере.
Насколько это безопасно?
Библиотека, которую я использую — CryptoJS — это программное обеспечение с открытым исходным кодом, так что я считаю, что она заслуживает доверия.
Я использовал алгоритм AES из коллекции, которая, насколько мне известно, безопасна. Для большей безопасности используйте длинные пароли, которые трудно подобрать:
JavaScript File Encryption App
HTML
Разметка приложения состоит из обычного документа HTML5 и нескольких блоков, которые разделяют приложение на несколько отдельных экранов. Вы увидите, как они взаимодействуют в разделах JavaScript и CSS данной статьи.
Picocrypt: портативная и очень простая программа для шифрования
JavaScript File Encryption App Что вы хотите сделать? Зашифровать файл Расшифровать файл
Выберите файл для расшифровки
Только файлы зашифрованные с помощью данного инструмента.
Обзор
Введите пароль.
Введите пароль, который использовался при шифровке файла.
Без него вы не сможете расшифровать файл.
Зашифровать! Ваш файл готов! Скачать
Во время работы приложения только один из блоков выполнения виден на экране.
В зависимости от выбора пользователя — шифрование или расшифровка — для элемента тела устанавливается имя класса.
С помощью CSS это имя класса определяет скрываются или выводятся элементы с классами if-encrypt или if-decrypt . Этот простой способ разделения позволяет обеспечить более чистый код, в котором минимально присутствуют элементы интерфейсов:
Выбор файла для шифрования
Код JavaScript
Как я уже упоминал, мы собираемся использовать HTML5 FileReader API ( поддержка ) и библиотеку CryptoJS .
Объект FileReader позволяет нам читать содержимое локальных файлов с помощью JavaScript, но только тех файлов, которые были выбраны пользователем непосредственно через диалоговое окно, предлагающее выбрать файл.
Как это делается, вы можете понять при рассмотрении ниже приведенного кода. Обратите внимание, что большая часть кода обрабатывает переходы между различными экранами приложения, а само считывание файла происходит, начиная со строки 85:
assets/js/script.js $(function()< var body = $(‘body’), stage = $(‘#stage’), back = $(‘a.back’); /* Шаг 1 */ $(‘#step1 .encrypt’).click(function()< body.attr(‘class’, ‘encrypt’); // Переход к шагу 2 step(2); >); $(‘#step1 .decrypt’).click(function()< body.attr(‘class’, ‘decrypt’); step(2); >); /* Шаг 2 */ $(‘#step2 .button’).click(function()< // Вызов окна выбора файла $(this).parent().find(‘input’).click(); >); // Определение действия ввода файла var file = null; $(‘#step2’).on(‘change’, ‘#encrypt-input’, function(e) < // Файл выбран? if(e.target.files.length!=1)< alert(‘Пожалуйста введите файл для шифрования!’); return false; >file = e.target.files[0]; if(file.size > 1024*1024) < alert(‘Пожалуйста выберите файл размером меньше, чем 1 Мбайт, в противном случае ваш браузер может быть перегружен. nЭто распространенная проблема. См. пособие.’); return; >step(3); >); $(‘#step2’).on(‘change’, ‘#decrypt-input’, function(e) < if(e.target.files.length!=1)< alert(‘Пожалуйста выберите файл для расшифровки!’); return false; >file = e.target.files[0]; step(3); >); /* Шаг 3 */ $(‘a.button.process’).click(function() < var input = $(this).parent().find(‘input[type=password]’), a = $(‘#step4 a.download’), password = input.val(); input.val(»); if(password.length<5)< alert(‘Пожалуйста придумайте более длинный пароль!’); return; >// Объект HTML5 FileReader позволяет нам считывать содержимое // выбранного файла. var reader = new FileReader(); if(body.hasClass(‘encrypt’))< // Зашифровать файл! reader.onload = function(e)< // Используем библиотеку CryptoJS и шифр AES, чтобы // зашифровать содержимое файла, который содержится в // e.target.result, с паролем var encrypted = CryptoJS.AES.encrypt(e.target.result, password); // Скачиваем атрибут, который по ссылке вызывает контент, // при нажатии на ссылку происходит загрузка содержимого. // Он также содержит имя файла, который предлагается // скачать. a.attr(‘href’, ‘data:application/octet-stream,’ + encrypted); a.attr(‘download’, file.name + ‘.encrypted’); step(4); >; // Данный фрагмент кодирует содержимое файла в data-uri. // Это запускает обработку загруженного файла, с результатом reader.readAsDataURL(file); > else < // Расшифровка файла! reader.onload = function(e)< var decrypted = CryptoJS.AES.decrypt(e.target.result, password) .toString(CryptoJS.enc.Latin1); if(!/^data:/.test(decrypted))< alert(«Неверный пароль или путь к файлу! Пожалуйста, попробуйте еще раз.»); return false; >a.attr(‘href’, decrypted); a.attr(‘download’, file.name.replace(‘.encrypted’,»)); step(4); >; reader.readAsText(file); > >); /* Кнопка возврата */ back.click(function()< // Новая инициализация формы выбора файла, // таким образом, что в ней не сохраняется сделанный ранее выбор $(‘#step2 input[type=file]’).replaceWith(function()< return $(this).clone(); >); step(1); >); // Вспомогательная функция, которая перемещает окно просмотра в блок, соответствующий текущему шагу function step(i) < if(i == 1)< back.fadeOut(); >else < back.fadeIn(); >// Перемещение блока #stage. Смена свойства top вызывает // css-преобразование элемента i-1 потому что мы хотим, чтобы // очередность начиналась с шага 1: stage.css(‘top’,(-(i-1)*100)+’%’); > >);
Я получил содержимое файлов в виде строки uri-данных . Браузеры позволяют использовать эти URI, везде, где могут использоваться обычные URL-адреса.
Их преимущество заключается в том, что они позволяют хранить исходное содержимое непосредственно в URI, поэтому мы можем, например, записать содержимое файла в виде ссылки href , а также добавить к ней атрибут download , чтобы при нажатии она загружалась, как файл.
Я использую алгоритм AES для шифрования URI-данных с выбранным паролем, и предлагаю его для скачивания. Во время расшифровки происходит обратная процедура.
При этом никакие данные на сервер на самом деле не пересылаются. Если на то пошло, вам даже не нужен сервер, вы можете просто открыть HTML-файл непосредственно из папки на вашем компьютере, и использовать его как есть.
Ввод пароля
CSS
Здесь я опишу только наиболее интересные части CSS-кода, остальное вы можете увидеть в таблице стилей из zip -архива с исходными материалами.
Первое, о чем я хочу рассказать — это стили, которые создают макет и обеспечивают возможность плавного перехода между экранами путем изменения свойства top элемента #stage :
assets/css/styles.css body < font:15px/1.3 ‘Raleway’, sans-serif; color: #fff; width:100%; height:100%; position:absolute; overflow:hidden; >#stage < width:100%; height:100%; position:absolute; top:0; left:0; transition:top 0.4s; >#stage > div < /* Блоки шагов */ height:100%; position:relative; >#stage h1 < font-weight:normal; font-size:48px; text-align:center; color:#fff; margin-bottom:60px; >#stage h2 < font-weight: normal; font-size: 14px; font-family: Arial, Helvetica, sans-serif; margin: -40px 0 45px; font-style: italic; >.content
Поскольку для блоков шагов задаются размеры в 100% по ширине и высоте, они автоматически занимают полный размер окна браузера без необходимости дополнительных преобразований.
Еще одним интересным фрагментом кода являются условные классы, которые значительно упрощают наш JavaScript:
[class*=»if-«] < display:none; >body.encrypt .if-encrypt < display:block; >body.decrypt .if-decrypt
Таким образом, классы шифрования и расшифрования тела приложения управляют видимостью элементов, которые имеют соответствующий класс if-* .
Мы закончили!
На этом наше JavaScript-приложение для шифрования данных готово! Вы можете использовать его, чтобы поделиться фотографиями и документами с друзьями, отправив им зашифрованную версию файла с предварительно оговоренной кодовой фразой.
Или можете записать HTML-код приложения на флешку, вместе с вашими зашифрованными файлами и расшифровать их напрямую, открыв файл index.html .
Источник: www.internet-technologies.ru
Статья Делаем быструю и удобную программу для шифрования файлов с usb сертификатом
Надумал сделать удобную программу для шифрования файлов без паролей, с использованием ключа, чтобы он хранился на носителе, таким образом чтобы шифровать/дешифровать файлы/директории было удобно и просто, запустил экзешник, засунул флешку, и готово. Алгоритм симметричного шифрования работает достаточно быстро, да и к слову совсем изголяться и от кого то прятаться не является целью данной статьи.
Но у меня есть доки и файлы, в которых я могу писать пароли к некоторым сервисам и тд. т.к. всего не упомнишь и хотелось бы чтобы эти данные были скрыты от чужих глаз, если что. Фотки видосы скрипты — все что угодно. Мне понравилась функциональность данного скрипта и я использую его в своих целях, именно поэтому решил написать тут, кто то может использовать его или допилить и сделать более круто и удобно т.к. сам код достаточно прост. Заодно попытаюсь немного разобрать плюсы/минусы симметричного шифрования, на деле же думаю что более безопасен гибридный метод совмещающий ассиметричные и симметричные алгоритмы. Но тем не менее, просто так с наскока расшифровать какие-то файлы без ключа, не думаю что просто так получиться. Конечно же исхожу из мысли, что это не какие то секретные документы от которых зависят судьбы государств. (что простите ? ) Лирическое отступление такое Давайте разберем :
Симметричное шифрование
Итак, симметричное шифрование (далее СШ ) — это способ шифрования/дешифровки с использованием одного ключа.
В ассиметричном — как вы знаете, используются два ключа, закрытый/открытый (Диффи Хелманы — все дела). Основной недостаток СШ — это то, что ключ всего один и для расшифровки вам надо как то передать его той же Алисе. Поэтому для ЭЦП и других подобных задач симметричные алгоритмы не применяются. Но этот недостаток для нас как раз таки не имеет значения. Мы сгенерим свой ключ, чтобы он хранился только у нас и больше никто не имел доступа к нему.
Готовим флешку
В принципе особо готовить ничего и не надо. Нужна безопасная флеха, которую мы не пихаем в первые попавшиеся тачки, а храним где то на ключах или типо того, для каких-нибудь особых случаев ) На usb-хе будет создана директория, в который будет лежать ключик. Далее нужно проделать одну манипуляцию, дело в том, что путь до ключа будет захардкожен в скрипте, ибо не вижу смысла каждый раз для шифра/дешифра прописывать лишние строки. Поэтому назначаю постоянную букву для флешки в управлении дисками. Делаю это под виндой, для линуха надо назначить постоянное имя для носителя, нашел вот такую
Ссылка скрыта от гостей
. Таким образом под линь надо поменять одну строку кода, в которой прописан путь до сертификата.
Имеем постоянный путь к этой флешке: X:
В скрипте используется Fernet из модуля cryptography. Все достаточно тривиально, три команды на инпут шифровать/дешифровать/генерировать новый ключ .
# -*- codng: utf8 -*- import os import sys from cryptography.fernet import Fernet # AES 128 CBC # интро такое себе, предлагаю сделать лучше 😀 intro = [‘ИНТРО?’] def print_intro(): for x in intro: print(x) def write_key(): key = Fernet.generate_key() with open(‘pantera.key’, ‘wb’) as key_file: key_file.write(key) def load_key(): # путь до директории и ключа на USB return open(r’X:pantera_keypantera.key’, ‘rb’).read() def encrypt_file(filename): key = load_key() f = Fernet(key) with open(filename, ‘rb’) as file: file_data = file.read() encrypted_data = f.encrypt(file_data) print(‘file <> was encrypt’.format(filename)) with open(filename, ‘wb’) as file: file.write(encrypted_data) def encrypt_directory(crypt_dir): try: for file in os.listdir(crypt_dir): if os.path.isdir(crypt_dir + ‘\’ + file): encrypt_directory(crypt_dir + ‘\’ + file) if os.path.isfile(crypt_dir + ‘\’ + file): try: encrypt_file(crypt_dir + ‘\’ + file) except: pass except Exception as e: print(e) def decrypt_file(filename): key = load_key() f = Fernet(key) with open(filename, ‘rb’) as file: encrypted_data = file.read() decrypted_data = f.decrypt(encrypted_data) print(‘file <> was decrypt’.format(filename)) with open(filename, ‘wb’) as file: file.write(decrypted_data) def decrypt_directory(decrypt_dir): try: for file in os.listdir(decrypt_dir): if os.path.isdir(decrypt_dir + ‘\’ + file): decrypt_directory(decrypt_dir + ‘\’ + file) if os.path.isfile(decrypt_dir + ‘\’ + file): try: decrypt_file(decrypt_dir + ‘\’ + file) except: pass except Exception as e: print(e) def pantera(): while True: try: cord = input(‘crypt/decrypt/genkey # ‘) if cord == ‘crypt’: crypt_dir = input(‘Crypt directory # ‘) try: encrypt_directory(crypt_dir) except Exception as e: print(e) elif cord == ‘decrypt’: decrypt_dir = input(‘Decrypt directory # ‘) try: decrypt_directory(decrypt_dir) except Exception as e: print(e) elif cord == ‘genkey’: write_key() else: print(») print(‘Wrong command . ‘) except KeyboardInterrupt: sys.exit() if __name__ == ‘__main__’: print_intro() pantera()
Компилим все этой в .exe pyinstaller’ом
pyinstaller —onefile script.py icon=your_picture.ico
И получаем резвый и достаточно удобный в использовании скрипт. Для использования: втыкаем флешку, запускаем .exe
Все готово. Работает как уже говорил достаточно резво, для небольших файлов до 500 Мб практически незаметно.
Спасибо за внимание !
Источник: codeby.net
Шифрование информации в Linux
С зарождением цивилизации появилась необходимость передачи информации между людьми. При чём таким способом, чтобы эта информация не стала доступной третьим лицам.
С течением времени технологии развивались, количество информации увеличивалось, а методы её перехвата усложнялись.
В настоящее время происходит активное внедрение цифровых технологий в различные сферы человеческой жизни, поэтому вопрос защиты информации при её хранении и передаче является особенно актуальным.
Я расскажу о том, как сохранить конфиденциальность своей информации с помощью инструмента GPG.
GnuPG (Gnu Privacy Guard) — свободная программа для шифрования информации и создания электронных цифровых подписей. Разработана как альтернатива коммерческой программе PGP. GnuPG полностью совместима со стандартом IETF OpenPGP.
Инструмент командной строки для GnuPG называется GPG. Им я и буду пользоваться. В данной публикации все манипуляции будут выполняться в операционной системе Linux. В ней уже установлено программное обеспечение GnuPG.
Если вы используете macOS, то вам нужно установить GPG-Suite, или воспользоваться командой brew install gnupg2. Если вы пользователь Windows, то советую вам установить GPG4Win.
Шифрование файла с помощью пароля
Далее речь пойдёт о симметричном шифровании. Методе шифрования, при котором для шифрования и дешифрования применяется один и тот криптографический ключ.
1. Создание текстового файла для шифрования
Создать пустой файл через терминал можно с помощью команды: cat > имя_файла .
Файл будет создан в вашей домашней папке.
В данном случае:
Запишем в файл стихотворение Евгения Евтушенко.
2. Шифрование файла
Вводим следующую команду: gpg -c message.txt .
Опция -с (или —symmetric ) означает шифрование только симметричным шифром. Далее нужно будет ввести фразу-пароль, которая станет ключом.
В итоге в директории с исходным файлом появится файл с расширением gpg. Это зашифрованный файл.
Если попытаетесь его открыть как обычный файл, то увидите примерно следующее:
3. Дешифрование
Для расшифровки этого файла следует ввести в терминале следующую команду: gpg —decrypt message.txt.gpg . Утилита запросит фразу-пароль. Если был введён верный пароль, то на экране отобразится исходный текст.
Для записи дешифрованной информации в отдельный файл добавьте опцию —output и после укажите название файла.
Шифрование файла с помощью ключей
Шифрование с помощью пары ключей – это уже ассиметричное шифрование. Данный метод является более надёжным. Шифрование осуществляется с помощью публичного ключа, а дешифровка — с использованием приватного ключа. Без приватного ключа вы не сможете выяснить что содержалось в исходном файле.
1. Создание ключей
Для создания пары ключей наберите следующую команду в терминале: gpg —full-generate-key .
Необходимо будет ввести тип ключа, размер ключа (по умолчанию 3072 бит), срок действия ключа, идентификатор пользователя (полное имя, адрес электронной почты) и примечание ключа (если нужно).
Идентификатор пользователя будет использован в качестве идентификатора ключа.
В конце нужно будет подтвердить корректность введённой информации и придумать фразу-пароль для защиты нового ключа.
В документации также указана команда gpg –gen-key , но при её использовании ряд параметров такие, как тип, размер ключа будут взяты по умолчанию. Срок действия ключа будет 2 года.
В скрытой директории ~./gnupg появятся файлы с ключами. В файле pubring.gpg публичный ключ, а в secring.gpg — приватный.
Также все свои доступные ключи можно увидеть с помощью команды: gpg –list-keys .
На скриншоте два ключа: первый был создан с помощью команды gpg –gen-key , второй – с помощью gpg –full-generate-key с параметрами, указанными ранее.
3. Шифрование
Для шифрования введите следующую команду: gpg -e -r идентификатор_пользователя имя_файла .
В качестве идентификатора пользователя я указал просто Dmitry, поэтому утилита выбрала первый по порядку ключ. Чтобы зашифровать информацию с помощью второго ключа, нужно было ввести идентификатор однозначно определяющий второй ключ. Например, ‘Dmitry Alekseev (best key)’.
Опять же в директории с исходным файлом будет создан файл с расширением gpg.
3. Дешифрование
Команда для дешифровки: gpg -d имя_файла.gpg .
Необходимо ввести фразу-пароль.
После в терминале отобразится дешифрованная информация.
Использование цифровой подписи для файла
Цифровая подпись позволяет подтвердить авторство электронного документа. На основе файла и ключа создаётся отпечаток, который записывается в файл. Если файл будет изменён, то отпечаток уже не совпадёт.
1. Создание цифровой подписи
Вы можете подписать файл с помощью команды: gpg -sign имя_файла .
Для создания подписи будет использован ранее созданный секретный ключ, поэтому нужно будет снова ввести фразу-пароль.
Опять же в директории с исходным файлом появится файл с расширением gpg.
Также вы можете создать подпись в отдельном файле: gpg -b имя_файла .
В директории появится файл с расширением sig.
2. Проверка подлинности файла
Введите следующую команду: gpg —verify имя_файла.sig имя_файла .
Если файл не был изменён, то вы увидите следующее.
Если файл был изменён, то при проверке на экране появится следующее сообщение.