Шифрование строки

Недавно ко мне обратился клиент, который захотел иметь в базе данные, значения которых он не хотел предоставлять никому, в том числе и пользователям с правами администратора. Они должны были использоваться при анализе деятельности предприятия.

   Таким образом — встала задача шифрования значения одного из реквизитов регистра. Понимая, что ни для этого клиента, ни для этой базы не нужен какой-либо реально стойкий алгоритм шифрования, а также зная, что работу базы не поддерживает ни один постоянный 1С-ник, то остановился на простом решении. Весь алгоритм шифрования-дешифрования уложился в 40 строчек текста программы.

 

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

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

Было решено проводить посимвольное шифрование с использованием кодового слова следующим образом 

  НовыйКодСимвола = КодСимволаИсходнойСтроки+КодСимволаКлючевогоСлова.

Тогда одинаковые символы на разных местах исходной строки будут представлены разными кодами. 

Для 1С7.7  1 символ=1 байт.  Максимальный код нового символа может быть 510=255+255. Чтобы новый код представлялся всегда не более чем двумя символами 16-ричной системы счисления уже не хватает, но достаточно 24-ричной.

Для 1С8.2 1символ=2 байтам. Будем считать, что в кодовом слове будут использоваться только русские и латинские символы и стандартные знаки и цифры. Тогда код символа не будет превышать значения кода буквы «ё» — 1105, которая идет после «я». Нужна уже 47-ричная система, если шифровать 1 символ исходного слова в  2 символа шифрованного, или 14-ричная, если в 3 символа.

Если для стандартного вида 16-ричного числа используется ряд “01…….9ABCDEF”, то для 24-ричного числа можно продолжить этот ряд дальше, а можно использовать любой ряд из 24 неповторяющихся символов, тоже относится и к 47-ричной системе

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

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

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

  Реализуется на любой платформе и на любом языке программирования. В приложении — обработки для 1С7.7  и 1С8.2.

 

 

15 Comments

  1. evd-x

    Недавно ко мне обратился клиент, который захотел иметь в базе данные, значения которых он не хотел предоставлять никому, в том числе и пользователям с правами администратора. Они должны были использоваться при анализе деятельности предприятия.

    Таким образом — встала задача шифрования значения одного из реквизитов регистра. Понимая, что ни для этого клиента, ни для этой базы не нужен какой-либо реально стойкий алгоритм шифрования, а также зная, что работу базы не поддерживает ни один постоянный 1С-ник, то остановился на простом решении. Весь алгоритм шифрования-дешифрования уложился в 40 строчек текста программы.

    Перейти к публикации

    Reply
  2. Поручик

    (0) Клиент — торговец оружием или наркотиками?

    Reply
  3. marsohod

    (1) Поручик, скорее — медицинскими препаратами 😉

    Reply
  4. TrinitronOTV
    marsohod пишет:

    (1) Поручик, скорее — медицинскими препаратами 😉

    а эту деятельность надо теперь шифровать?

    Reply
  5. evd-x

    (1) Клиент — из серии «неуловимый Джо». Он шифруется от собственных сотрудников, а не от внешних врагов.

    У внешних термо-ректальный метод расшифровки работает всегда, внутренним применять его затруднительно.

    Reply
  6. Михаська

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

    Reply
  7. Михаська

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

    Reply
  8. evd-x

    (6) Всякое решение имеет ограничения. В данном случае защищаются не от профессионалов.

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

    Поэтому нет смысла тратить время и деньги на то, что может легко быть достигнуто другим путем. У нас в стране любят говорить о «несимметричных ответах». В комментарии (4) я уже упоминал термо-ректальный метод. Он решает подобные проблемы ровно за 2 минуты.

    Reply
  9. evn-zorin

    «термо-ректальный» — от души!:)

    Reply
  10. evd-x

    (8) evn-zorin, Есть разные варианты использования метода — термо-ректальный — сначала включить, потом вставить. Ректо-термальный — соответственно сначала вставить, потом включить. Методика разная — результат одинаковый

    Reply
  11. andru_dv

    Вот оно как просто то всё, оказывается. А я то голову ломал… как шифровать чиселки!

    Reply
  12. baxxeg

    А что не взять готовое решение на форуме — кодирование в MD5?

    Reply
  13. evd-x

    (12) baxxeg, В этом решении не требуется вообще ни одной сторонней библиотеки или компоненты, реализуется на любом языке. Из пушки по воробьям стрелять не хочется…

    Reply
  14. vladshnurkoff

    Забавно )) Взял на заметку. Спасибо!

    Reply
  15. fr.myha

    Спасибо. Мне еще понравился этот способ http://infostart.ru/public/16791/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *