Перейти к содержимому
HeroBrine1st

CryptedNote - защищенные заметки в OC

Рекомендуемые сообщения

Установка - pastebin get wmAj3hcP /bin/cryptednote.lua

Библиотека - pastebin get uDnh4RLi /lib/crypt.lua

Альтернативный вариант установки (выберите там CryptedNote, это мой установщик на все мои проги :) ) - pastebin run 1xudmTa7

Использование:

cryptednote name [options]

Опции:

  1.  --rewrite; -w - перезапись файла
  2.  --execute; -x - исполнение файла без записи на диск

Пароль закрыт точками. Зашифрованные файлы хранятся в /usr/cryptednote (легко меняется в коде).

Если файл редактируется, он находится в /usr/cryptednote/temp.crtnt (в нешифровнном виде).

 

Код - https://pastebin.com/wmAj3hcP

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

...

Вводим новый пароль, смотрим краткое описание и инструктаж безопасности (10 секунд на прочтение)

...

 

Прикольно, но зачем ставить задержку 10 сек на прочтение того, что вывелось на экран. Просто сделать Event на нажатие.(и сообщение для продолжения нажмите любую клавишу).

Ведь скорость чтения у каждого разная, кто-то быстрей, кто-то медленней. А так прочитал кликнул и дальше работает. Без всяких лишних задержек.

Изменено пользователем Totoro
не надо цитировать стартовый пост целиком

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@HeroBrine1st, можешь пояснить назначение этого хитрого участка кода?

	print("Перезапись ключа в ОЗУ 35 раз")
	for i = 1, 35 do
		psk = string.random(psk:len())
	end
	print("Удаление ключа из ОЗУ")
	psk = nil
Насколько я знаю, достаточно последней строчки, если речь идёт об OpenComputers, а в контексте языков, приближенных к машинным, достаточно лишь один раз переписать находящийся в RAM ключ. Или есть иная информация?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@HeroBrine1st, можешь пояснить назначение этого хитрого участка кода?

	print("Перезапись ключа в ОЗУ 35 раз")
	for i = 1, 35 do
		psk = string.random(psk:len())
	end
	print("Удаление ключа из ОЗУ")
	psk = nil

 

ОЗУ компа на хост-мащине хранится в ее ПЗУ. Для полной перезаписи с удалением информации нужно 35 итераций.

Если включена буферизация, это не поможет, но если отключена - вполне рабочая вещь.

 

К слову, о мануале при первом запуске утилиты и продолжению по клику. Я сделал.

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

ОЗУ компа на хост-мащине хранится в ее ПЗУ. Для полной перезаписи с удалением информации нужно 35 итераций.

 

Откуда инфа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Откуда инфа?

Из какого-то канала Telegram. Подтвердить инфу не могу, увы(

Лишним не будет - выполняется моментально. os.sleep чисто для наблюдения процесса поставил, иначе ввел пароль и сразу к файлу

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Откуда инфа?

из суеверных источников :)  

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Из какого-то канала Telegram. Подтвердить инфу не могу, увы(

Сложно подтвердить инфу, которая легко опровергается. Всякий источник информации может оказаться полезным, но не всякую информацию стоит принимать на веру. Исключение составляют только случаи, когда в данный момент проверка информации не представляется возможной, а источник уже имеет хорошую репутацию. Это как с теориями физики, о которых здесь на форуме даже как-то спорили: теории, конечно, не идеальные, но лучших в данный момент всё равно нет.

 

Лишним не будет - выполняется моментально.

При такой логике любую операцию можно повторять 35 раз. Ну, а что, моментально же выполняется.

 

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

 

Любая локальная переменная доступна исключитлельно в области своей видимости. Соответственно, локальная переменная psk доступна только в предалах блока do ... end, внутри которого она была объявлена, а по окончанию его работы занимаемаемая ею память становится доступной для освобождения сборщиком мусора. Но и на этом этапе содержимое переменной не будет удалено. Оно будет затёрто лишь при инициализации новых переменных, если они, конечно, будут созданы на этом участке памяти. Операция psk = nil тоже не удаляет строку, а лишь указывает, что теперь значение переменной пустое, а ранее занятая переменной память может быть освобождена сборщиком мусора. И даже psk = string.random(psk:len()) не перезаписывает пароль в ОЗУ, а лишь создаёт новую строку, и присваивает ссылку на неё переменной psk, а сама же строка остаётся в неизименном виде до тех пор, пока до неё не доберётся сборщик мусора. Но и он, как говорилось выше, переменную не очищает.

 

Что мы имеем в итоге? 35 раз создаётся новая строка, а ссылка не неё присваивается переменной psk, каждый раз затирая предыдущую ссылку (не строку!). Потом ссылка (не строка!) очищается при выполнении psk = nil. А по окончании выполнения блока do ... end теряется доступ к самой переменной psk. Значение имеет только последнее действие: доступ к переменной потерян. Сам ключ и 35 экземпляров случайных строк продолжают висеть в памяти. Со временем сборщик мусора освободит память из-под этих переменных, а их значения так и останутся в памяти, пока на их месте не будут созданы и инициализированы новые переменные.

 

Конечно, интенсивное создание случайных строк ускорит использование сборщика мусора и в конечном итоге даже перезапись того участка памяти, где когда-то был ключ. Но возникают два вопроса. Почему 35 итераций достаточно для гарантированного удаления ключа? И какая в этом польза, если доступ к ключу внутри Lua всё равно уже потерян, а другого доступа в OpenComputers нет и не предвидится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

по исследованию исходного кода ОС, gc вызывается при вызове computer.pullSignal, но я не специалист в скале потому могу ошибаться

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я называю такой код - "вуду-программирование".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
И какая в этом польза, если доступ к ключу внутри Lua всё равно уже потерян, а другого доступа в OpenComputers нет и не предвидится?

Я рассчитывал на то, что если админам понадобится ключ - они пойдут в кеш сервера и пойдут его искать там. Ну раз у луа такая логика, значит придется удалить этот участок кода..

P.s. и переменные можно вообще не обнулять получается? нет смысла?

 

 

Почему 35 итераций достаточно для гарантированного удаления ключа?

При выключенной буферизации все изменения переменных будут моментально записаны на диск сервера. Если это HHD, то 35 (уточняется) итераций как раз будет достаточно для полной перезаписи информации (как оказалось, не информация перезаписывается, а ссылка на нее). А если SSD, то Trim удалит остаточные данные.

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чутка обновил утилиту.  Из изменений - заметки перенесены в/usr/cryptednote (легко меняется в коде, если надо все вернуть) и поддерживает огромные (реально огромные файлы вплоть до свободной ОЗУ) файлы. Но с последним проблемы, оно как-то не так записывает расшифрованный файл в /tmp/, обрезает его почему-то.

Установка тем же методом.

 

Про поддержку огромный файлов - они вызывали ошибку TLWY, пришлось делать цикл (спасибо за блочность алгоритма) и вставлять os.sleep(0).

P.s. там в коде можно найти gpu.set вместо term.write - это мне было лень делать функцию переноса курсора на начало строки)

 

UPD: еще флаг --execute сделал (или -x), расшифровывает файл и запускает его. Расшифрованный код никуда не записывается, он остается только в ОЗУ

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@HeroBrine1st,  /tmp/ - это монтированный путь виртуальной файловой системы tmpfs, жестко ограниченной по размеру в конфиге мода:

# The size of the /tmp filesystem that each computer gets for free. If
# set to a non-positive value the tmp file system will not be created.
tmpSize=64

Записывай напрямую на загрузочный хард - и все будет шоколадно. А еще для предотвращения TLWY проще использовать computer.pullSignal(0), что гарантирует разовое прерывание, т.к. OS.sleep() иногда умудряется вызвать pullSignal дважды. А прога клевая, мяу

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще раз обновил утилиту)

 

1. Как говорил ECS, теперь временный файлик находится на диске. По умолчанию - /usr/cryptednote/temp.crtnt, + использую computer.pullSignal

2. Заменил gpu.set на функцию write (стащил из другой своей программы :) ), которая стирает и пишет на последней записанной строке

И предыдущие изменения:

3. Поддерживает большие файлы

4. Появился флаг --execute (-x), который расшифровывает и вызывает файл без его записи на диск.

5. Файлы программы перенесены в /usr/cryptednote и это можно изменить в коде.

 

Из-за записи на загрузочный диск упала безопасность - в случае принудительного выключения устройства или (хуже) вытаскивания диска расшифованный файл так и останется лежать. Так что используем планшеты и желательно в безопасных местах)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...