Шифрование данных
Шифрование — это основной способ защиты данных при их передаче и хранении, который позволяет предотвратить чтение или изменение информации третьими лицами.
«1С:Шина» позволяет вам шифровать и расшифровывать данные, используя симметричные и асимметричные алгоритм ы шифрования.
«1С:Шина» не содержит собственные реализации алгоритмов шифрования, а использует криптографический фреймворк Java Cryptography Architecture (JCA). Вы также можете использовать модули криптографии сторонних производителей (Bouncy Castle, КриптоПро), предварительно установив их на сервере.
Для шифрования или расшифровки данных в коде используйте один из следующих способов:
- Если вам требуется зашифровать или расшифровать небольшой объем данных, вызовите статический метод
Зашифровать
илиРасшифровать
типаШифрованиеДанных
. - Если вы работаете с большим объемом информации, вы можете шифровать/расшифровывать данные частями. Для этого создайте экземпляр типа
ШифрованиеДанных
и используйте методыДобавитьДанные
иПолучитьРезультат
.
Симметричное шифрование
Симметричное шифрование — это способ шифрования данных, при котором для шифрования и расшифровки применяется один и тот же ключ. Алгоритмы симметричного шифрования делятся на два типа:
- Блочные — шифруют данные блоками определенной длины (как правило, 64 или 128 бит). Если исходный текст и ли его последняя часть меньше размера блока, то его дополняют, чтобы привести к нужной длине. Примеры блочных шифров: AES, Blowfish, DES, Triple DES, RC2.
- Потоковые — шифруют каждый бит или байт исходного текста с использованием гаммирования (наложения последовательности, состоящей из случайных чисел, на открытый текст). Примеры потоковых шифров: RC4, SEAL, WAKE.
Перечисление АлгоритмСимметричногоШифрования
содержит основные алгоритмы шифрования, поддерживаемые в «1С:Шина». Вы также можете использовать и другие алгоритмы, которые поддерживаются вашим криптопровайдером. Для этого укажите название необходимого алгоритма в виде строки (например, "RC4"
).
Чтобы сгенерировать секретный ключ для шифрования данных, вызовите метод СоздатьСекретныйКлюч
типа ГенераторСекретногоКлюча
или ГенераторСекретногоКлючаНаОсновеПароля
.
метод СгенерироватьКлюч()
// Генерация секретного ключа с использованием алгоритма AES-256.
знч ГенераторКлюча = новый ГенераторСекретногоКлюча(АлгоритмСимметричногоШифрования.Aes,
РазмерКлюча = 256)
знч СекретныйКлюч = ГенераторКлюча.СоздатьСекретныйКлюч()
;
метод СгенерироватьКлюч()
// Генерация секретного ключа с использованием алгоритма AES-256 на основе пароля.
знч ГенераторКлюча = новый ГенераторСекретногоКлючаНаОсновеПароля(АлгоритмСимметричногоШифрования.Aes,
РазмерКлюча = 256)
знч СекретныйКлюч = ГенераторКлюча.СоздатьСекретныйКлюч("Password", Соль = Байты{7d60435f02e9e0ae})
;
Для работы симметричного шифра помимо ключа также необходимо указать трансформацию — набор преобразований, которые следует выполнить для получения результата. Трансформация указывается как строка вида "алгоритм/режим шифрования/дополнение"
или только "алгоритм"
, где:
- алгоритм — используемый алгоритм симметричного шифрования;
- режим шифрования — метод применения блочного шифра, позволяющий преобразовать блоки открытого текста в блоки зашифрованного текста. Основные режимы включают:
- None — указывает, что режим шифрования не используется;
- ECB (Electronic CodeBook) — режим электронной кодовой книги;
- CBC (Cipher Block Chaining) — режим сцепления блоков шифротекста;
- CFB (Cipher Feedback) — режим обратной связи по шифротексту;
- OFB (Output Feedback) — режим обратной связи вывода;
- CTR (Counter) — режим счетчика.
- дополнение (padding) — определяет, как необходимо дополнить исходное сообщение, чтобы его длина стала кратна размеру блока. Примеры: NoPadding, PKCS5Padding и т. д.
Основные трансформации, поддерживаемые «Шиной», представлены в перечислении ПреобразованиеСимметричногоШифрования
, но вы также можете использовать другие типы трансформаций, указав их в виде строки (например, "AES/CFB/NoPadding"
). В этом случае убедитесь, что данные трансформации поддерживаются выбранным вами криптопровайдером.
Примеры ниже показывают, как шифровать и расшифровывать данные, используя симметричный алгоритм шифрования AES. В качестве режима шифрования используется режим электронной кодовой книги (ECB), при котором каждый блок открытого текста шифруется независимо от остальных блоков с использованием одного и того же ключа шифрования.
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
// Шифрование открытого текста.
// Криптопровайдер выбирается автоматически.
знч Шифротекст = ШифрованиеДанных.Зашифровать(ОткрытыйТекст, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
возврат Шифротекст
;
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
// Шифрование открытого текста.
// Криптопровайдер выбирается автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
знч Шифротекст = Шифр.ПолучитьРезультат(ОткрытыйТекст)
возврат Шифротекст
;
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер выбирается автоматически.
знч ОткрытыйТекст = ШифрованиеДанных.Расшифровать(Шифротекст, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
возврат ОткрытыйТекст
;
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер выбирается автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
знч ОткрытыйТекст = Шифр.ПолучитьРезультат(Шифротекст)
возврат ОткрытыйТекст
;
Асимметричное шифрование
Асимметричное шифрование — это способ шифрования данных, при котором используются два математически связанных ключа — открытый и закрытый. Открытый (публичный) ключ используется для шифрования сообщения, а закрытый (секретный) ключ — для его расшифровки. Данные ключи являются равнозначными, то есть, если открытый ключ используется для шифрования данных, расшифровать их можно только с помощью закрытого ключа. И наоборот, если закрытый ключ используется для шифрования, выполнить расшифровку можно будет только с помощью открытого ключа.
«1С:Шина» поддерживает наиболее распространенный алгоритм асимметричного шифрования — RSA, основывающийся на вычислительной сложности задачи факторизации больших полупростых чисел. Вы также можете использовать другие асимметричные алгоритмы, предназначенные для шифрования данных. Для этого вам необходимо установить сторонний криптопровайдер, содержащий реализацию данного алгоритма. Например, если вы хотите использовать алгоритм ElGamal, установите криптопровайдер Bouncy Castle.
Используйте метод СоздатьПаруКлючей
типа ГенераторПарыКлючей
, чтобы сгенерировать пару открытого и закрытого ключей асимметричного шифрования. Этот метод позволяет вам указать алгоритм шифрования и размер ключа. Вы также можете использовать упрощенный метод СоздатьПаруКлючейRsa
, чтобы создать пару ключей шифрования по алгоритму RSA.
метод СгенерироватьКлючи()
// Генерация ключей шифрования с использованием алгоритма RSA.
знч КлючиШифрования = новый ГенераторПарыКлючей(Алгоритм=АлгоритмАсимметричногоШифрования.Rsa,
РазмерКлюча = 1024).СоздатьПаруКлючей()
знч ОткрытыйКлюч = КлючиШифрования.ОткрытыйКлюч
знч ЗакрытыйКлюч = КлючиШифрования.ЗакрытыйКлюч
;
После того как ключи шифрования получены, вы можете приступить к шифрованию/расшифровке данных, как показано в примерах ниже.
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
// Шифрование текста открытым ключом с использованием алгоритма RSA.
// Криптопровайдер выбирается автоматически.
возврат ШифрованиеДанных.Зашифровать(ОткрытыйТекст, ОткрытыйКлюч, "RSA")
;
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
// Шифрование текста открытым ключом.
// Криптопровайдер выбирается автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, ОткрытыйКлюч, "RSA")
возврат Шифр.ПолучитьРезультат(ОткрытыйТекст)
;
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
// Расшифровка зашифрованного текста с использованием алгоритма RSA.
// Криптопровайдер выбирается автоматически.
возврат ШифрованиеДанных.Расшифровать(Шифротекст, ЗакрытыйКлюч, "RSA")
;
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер выбирается автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, ЗакрытыйКлюч, "RSA")
возврат Шифр.ПолучитьРезультат(Шифротекст)
;