Пароли в коде 1С 8.3: когда хешировать, когда шифровать и где держать ключ

· 11 мин

Содержание

Пароль в 1С 8.3 защищают одним из трёх способов. Если пароль нужно только проверять (вход в вашу подсистему, ПИН-код), храните не сам пароль, а его хеш через ХешированиеДанных с солью. Если пароль нужно отдавать внешнему сервису (почта, FTP, API банка, маркетплейс), кладите его в безопасное хранилище БСП, а при необходимости дополнительно шифруйте через МенеджерКриптографии с сертификатом.

Выбор зависит от одного вопроса: нужно ли потом получить пароль обратно в открытом виде. Хеш необратим и подходит для проверки. Шифрование обратимо, но тогда появляется ключ, и защищать приходится уже его. Всё описанное относится к платформе 8.3 и типовым конфигурациям на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11 и другие).

Что умеет встроенная криптография платформы 1С

В языке 1С нет функции вида «ЗашифроватьСтроку(Строка, Ключ)» с симметричным алгоритмом. Это первое, что удивляет разработчика, пришедшего из других языков. Зато есть несколько встроенных инструментов, которые закрывают разные задачи.

ИнструментЧто делаетОбратимоЧто нужно
ХешированиеДанныхСчитает хеш (CRC32, MD5, SHA1, SHA256)НетНичего, есть в платформе
Безопасное хранилище БСППрячет данные от пользователей правами доступаДаКонфигурация на БСП
МенеджерКриптографииШифрует на сертификат, подписываетДаКриптопровайдер и сертификат
ЗаписьZipФайла с паролемАрхив с шифрованием AES-256ДаНичего, есть в платформе
Внешняя компонентаЛюбой алгоритм: AES, ГОСТ, DPAPIДаСама компонента и её поддержка

🔐 Хеширование — основа для проверки паролей. 📦 Безопасное хранилище — основа для паролей интеграций в типовых конфигурациях. 📜 Криптография с сертификатами — когда требуется настоящее шифрование и есть криптопровайдер.

Платформа сама хранит пароли пользователей информационной базы не в открытом виде, а в виде хеша. У объекта ПользовательИнформационнойБазы есть свойство СохраняемоеЗначениеПароля — это и есть сохранённая хеш-строка. Восстановить из неё пароль нельзя, только задать новый.

Хеш или шифрование: как выбрать способ защиты пароля

Ошибка в выборе метода обесценивает всё остальное. Шифровать пароль, который нужен только для сравнения, — лишний риск: появляется ключ, который могут украсть вместе с базой. Хешировать пароль от SMTP-сервера бессмысленно: из хеша его не достать, и письмо не уйдёт.

Что вы делаете с паролем после сохранения?

Отдельно про алгоритмы хеширования. MD5 и SHA1 для паролей сегодня не используют: для них есть готовые таблицы подбора и быстрые атаки. Берите ХешФункция.SHA256. CRC32 — это контрольная сумма, а не криптографический хеш, для паролей не годится совсем.

Base64 — не шифрование. Строку в Base64 раскодирует любой онлайн-сервис за секунду. То же касается самодельного «шифра» через XOR с фиксированной строкой или сдвиг символов.

Как зашифровать пароль в 1С кодом: три рабочих примера

Ниже три примера под три сценария из таблицы. Все они работают в серверном контексте. Код, который видит пароль в открытом виде, на клиенте выполняться не должен.

Хеш пароля с солью и повторным хешированием

Соль — случайная строка, уникальная для каждой записи. Она хранится рядом с хешем открыто. Задача соли — сделать так, чтобы у двух пользователей с паролем 123456 хеши различались, и готовые таблицы подбора не работали.

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

// Общий модуль, только сервер
Функция ХешПароля(Пароль, Соль) Экспорт

    Данные = Соль + Пароль;
    Для Сч = 1 По 10000 Цикл
        Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
        Хеширование.Добавить(ПолучитьДвоичныеДанныеИзСтроки(Данные, КодировкаТекста.UTF8));
        Данные = Соль + ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма);
    КонецЦикла;

    Возврат ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма);

КонецФункции

Функция НоваяСоль() Экспорт
    Возврат СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
КонецФункции

Функция ПарольВерный(ВведенныйПароль, СохраненнаяСоль, СохраненныйХеш) Экспорт
    Возврат ХешПароля(ВведенныйПароль, СохраненнаяСоль) = СохраненныйХеш;
КонецФункции

При регистрации вызывайте НоваяСоль(), затем ХешПароля() и записывайте в базу два реквизита: соль и хеш. При входе берите соль из записи, считайте хеш от введённого пароля и сравнивайте с сохранённым через ПарольВерный().

💡 Число итераций (здесь 10 000) подберите на своём сервере: проверка пароля должна укладываться в доли секунды. Если позже увеличите число, храните его в записи рядом с солью, иначе старые хеши перестанут совпадать.

Пароль интеграции в безопасном хранилище БСП

В конфигурациях на Библиотеке стандартных подсистем есть регистр сведений БезопасноеХранилищеДанных. Права на него не выдаются ни одной обычной роли. Работают с ним через функции общего модуля ОбщегоНазначения, и только в привилегированном режиме.

&НаСервереБезКонтекста
Процедура СохранитьПарольСервиса(Владелец, Пароль)
    УстановитьПривилегированныйРежим(Истина);
    ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, Пароль, "Пароль");
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Функция ПарольСервиса(Владелец) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "Пароль");
    УстановитьПривилегированныйРежим(Ложь);
    Возврат Пароль;
КонецФункции

Владелец — ссылка на объект, к которому относится пароль: элемент справочника настроек интеграции, учётная запись почты и т. п. Чтобы удалить пароль вместе с настройкой, есть ОбщегоНазначения.УдалитьДанныеИзБезопасногоХранилища.

Безопасное хранилище защищает правами, а не шифрованием. Администратор с полными правами, разработчик в Конфигураторе и любой, кто получил файл базы или выгрузку .dt, могут прочитать данные. Хранилище спасает от пользователя с обычной ролью и от случайного вывода пароля в отчёт, но не от утечки самой базы.

Настоящее шифрование через МенеджерКриптографии

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

// Сервер. Параметры модуля берутся из настроек криптопровайдера
Функция ЗашифроватьПароль(Пароль, ДанныеСертификата, ИмяМодуля, ПутьМодуля, ТипМодуля) Экспорт

    Менеджер = Новый МенеджерКриптографии(ИмяМодуля, ПутьМодуля, ТипМодуля);
    Сертификат = Новый СертификатКриптографии(ДанныеСертификата);
    Данные = ПолучитьДвоичныеДанныеИзСтроки(Пароль, КодировкаТекста.UTF8);

    Возврат Менеджер.Зашифровать(Данные, Сертификат);

КонецФункции

Функция РасшифроватьПароль(Зашифровано, ПарольКлюча, ИмяМодуля, ПутьМодуля, ТипМодуля) Экспорт

    Менеджер = Новый МенеджерКриптографии(ИмяМодуля, ПутьМодуля, ТипМодуля);
    Менеджер.ПарольДоступаКЗакрытомуКлючу = ПарольКлюча;
    Данные = Менеджер.Расшифровать(Зашифровано);

    Возврат ПолучитьСтрокуИзДвоичныхДанных(Данные, КодировкаТекста.UTF8);

КонецФункции

Результат Зашифровать — двоичные данные. Сохраните их в реквизит типа ХранилищеЗначения или в то же безопасное хранилище. ДанныеСертификата — двоичные данные файла открытого сертификата (.cer).

Криптопровайдер должен стоять на том компьютере, где выполняется код. Если шифруете на сервере 1С, провайдер и закрытый ключ нужны на сервере, а не у бухгалтера на рабочем месте. Имя, путь и тип модуля посмотрите в настройках программ электронной подписи вашей конфигурации (раздел Администрирование, настройки электронной подписи и шифрования).

Где хранить ключи шифрования и пароли от них

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

Чего делать нельзя:

  • ❌ Писать ключ или пароль константой в модуле. Текст модуля видит любой, у кого есть доступ к Конфигуратору или файл .cf.
  • ❌ Хранить ключ в константе или реквизите справочника, на которые есть права у обычных ролей.
  • ❌ Класть пароль в ХранилищеОбщихНастроек или настройки пользователя. Они не предназначены для секретов.
  • ❌ Держать файл с ключом в общей сетевой папке, куда ходят все сотрудники.

Что работает на практике:

  • ✅ Закрытый ключ в хранилище сертификатов ОС на сервере 1С. Доступ к нему есть только у учётной записи, от имени которой работает служба сервера (по умолчанию USR1CV8). Копия базы без сервера бесполезна.
  • ✅ Файл ключа на сервере с правами NTFS или chmod только для пользователя службы. Код читает его в серверном модуле. В базе — только путь.
  • ✅ Переменная окружения службы сервера 1С. Ключ не попадает ни в базу, ни в выгрузку .dt.
  • ✅ Безопасное хранилище БСП для паролей, которые нельзя увести из базы. Например, для файлового варианта без отдельного сервера.

💡 В файловом варианте база работает на компьютере каждого пользователя. Код выполняется там же, и спрятать ключ от пользователя, у которого есть доступ к папке базы, по сути нельзя. Для серьёзной защиты секретов переходите на клиент-серверный вариант.

Не забывайте про резервные копии. Выгрузка .dt содержит всё, включая регистр безопасного хранилища. Защищайте копии так же, как сам сервер: отдельная папка, ограниченные права, архив с паролем при передаче.

Внешние компоненты и утилиты для шифрования

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

СпособКогда выбираютРиски
Внешняя компонента Native APIНужен AES или ГОСТ без криптопровайдера, нужна работа на LinuxКомпоненту надо собирать и поддерживать под каждую платформу и разрядность
COM-объект (Windows)Сервер на Windows, есть готовая библиотекаНе работает на Linux и в веб-клиенте, требует регистрации в системе
Утилита командной строки (openssl)Разовое шифрование файлов, выгрузокПароль виден в списке процессов, если передать его аргументом
Криптопровайдер (КриптоПро CSP, ViPNet CSP)Уже используется для ЭДО и отчётностиЛицензия на сервер, настройка контейнеров

Компоненту подключают методом ПодключитьВнешнююКомпоненту с типом ТипВнешнейКомпоненты.Native. Компонента из сторонних рук получает доступ ко всему, что видит сервер 1С. Ставьте только ту, исходники или поставщика которой вы проверили.

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

Для файлов есть и встроенный вариант без компонент. ЗаписьZipФайла умеет шифровать архив алгоритмом AES-256:

Запись = Новый ЗаписьZipФайла(ИмяАрхива, ПарольАрхива, ,
    МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.AES256);
Запись.Добавить(ИмяФайлаСДанными);
Запись.Записать();

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

Как не потерять пароль по дороге: форма, клиент и журнал

Даже идеально зашифрованный пароль утекает в мелочах. Проверьте каждое место, где пароль проходит через систему.

Поле ввода на форме

У поля формы есть свойство РежимПароля. Включите его, и вместо символов будут звёздочки. Это защита от взгляда через плечо, не больше.

При открытии формы настройки не загружайте сохранённый пароль в реквизит. Покажите признак «Пароль задан» и пустое поле. Если пользователь ввёл новое значение — сохраните, если оставил пустым — не трогайте старое.

Передача между клиентом и сервером

Пароль, полученный на клиенте, передавайте на сервер один раз, в вызове сохранения. Обратно на клиент его не возвращайте. Функция ПарольСервиса() из примера выше вызывается только из серверного кода, который сам отправляет запрос во внешний сервис.

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

Журнал регистрации и сообщения

  • 🚫 Не пишите пароль в ЗаписьЖурналаРегистрации, даже при отладке.
  • 🚫 Не выводите строку подключения с паролем в Сообщить или текст исключения. При ошибке соединения сообщение уходит пользователю и в журнал.
  • 🚫 Не собирайте URL вида https://логин:пароль@сервер — он попадает в логи веб-сервера.

Исходный код модулей

Если отдаёте конфигурацию на сторону, модули с логикой проверки можно поставлять без исходных текстов. Это не шифрование, но снимает вопрос «посмотрел код — нашёл соль и число итераций». Хотя при правильной схеме это знание атакующему почти ничего не даёт: стойкость держится на пароле и ключе, а не на секретности алгоритма.

Проверка защиты паролей в вашей конфигурации
Выполнено: 0 / 8

Типичные ошибки при шифровании паролей в 1С

Здесь собраны ошибки, которые встречаются в доработках чаще всего и не очевидны по коду.

🔸 Хеш без соли. Одинаковые пароли дают одинаковые хеши. Простые пароли вроде qwerty находятся по готовым таблицам за секунды.

🔸 Сравнение хешей в разных кодировках. Хешировали строку в UTF-8, а при проверке в другой кодировке — хеши не совпадут, и вход перестанет работать. Всегда явно указывайте КодировкаТекста.UTF8 при переводе строки в двоичные данные.

🔸 Хеш как hex в одном месте и Base64 в другом. Одна и та же сумма в разном представлении. Договоритесь об одном формате и держите его в одной функции.

🔸 Привилегированный режим, который не выключили. Если между установкой и снятием режима случится исключение, код дальше пойдёт с полными правами. Короткие блоки, а в длинных — Попытка … Исключение со снятием режима в обработке ошибки.

🔸 Расшифровка на клиенте. Чтобы «не грузить сервер», закрытый ключ ставят каждому пользователю. В итоге ключ лежит на десятке компьютеров.

🔸 Потеря ключа или сертификата. Истёк сертификат, переустановили сервер, а резервной копии контейнера нет. Зашифрованные пароли превращаются в мусор. Держите копию ключа отдельно от сервера и план перевыпуска: все пароли придётся ввести заново.

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

Частые вопросы

Можно ли расшифровать пароль пользователя информационной базы 1С?
Нет. Платформа хранит только хеш пароля. Администратор может задать новый пароль в списке пользователей, но узнать старый не может.
Чем безопасное хранилище лучше обычной константы?
На регистр безопасного хранилища нет прав ни у одной пользовательской роли, а читать его можно только в привилегированном режиме на сервере. Константу легко случайно открыть ролью или вывести в отчёт.
Есть ли в 1С функция AES-шифрования строки?
Отдельной функции для строки нет. AES-256 доступен при записи ZIP-архива, остальное — через МенеджерКриптографии с криптопровайдером или внешнюю компоненту.
Работает ли хеширование в веб-клиенте и мобильном приложении?
Объект ХешированиеДанных доступен и на клиенте, но пароли лучше хешировать на сервере. Тогда алгоритм и число итераций одни для всех клиентов.
Что делать, если старые пароли хранились открытым текстом?
Перенесите их в безопасное хранилище обработкой, очистите старые реквизиты и смените пароли во внешних сервисах. Старые значения могли остаться в резервных копиях.