Шифрование данных
Шифрование — это основной способ защиты данных при их передаче и хранении, который позволяет предотвратить чтение или изменение информации третьими лицами.
«1С:Шина» позволяет вам шифровать и расшифровывать данные, используя симметричные и асимметричные алгоритмы шифрования.
- Если вам требуется зашифровать или расшифровать небольшой объем данных, вызовите статический метод Зашифровать или Расшифровать типа ШифрованиеДанных.
- Если вы работаете с большим объемом информации, вы можете шифровать/расшифровывать данные частями. Для этого создайте экземпляр типа ШифрованиеДанных и используйте методы ДобавитьДанные и ПолучитьРезультат.
Симметричное шифрование
Симметричное шифрование — это способ шифрования данных, при котором для шифрования и расшифровки применяется один и тот же ключ. Алгоритмы симметричного шифрования делятся на два типа:
- Блочные — шифруют данные блоками определенной длины (как правило, 64 или 128 бит). Если исходный текст или его последняя часть меньше размера блока, то его дополняют, чтобы привести к нужной длине. Примеры блочных шифров: AES, Blowfish, DES, Triple DES, RC2.
- Потоковые — шифруют каждый бит или байт исходного текста с использованием гаммирования (наложения последовательности, состоящей из случайных чисел, на открытый текст). Примеры потоковых шифров: RC4, SEAL, WAKE.
Перечисление АлгоритмСимметричногоШифрования содержит основные
алгоритмы шифрования, поддерживаемые в «1С:Шина». Вы также можете
использовать и другие алгоритмы, которые поддерживаются вашим криптопровайдером. Для
этого укажите название необходимого алгоритма в виде строки (например,
"RC4"
).
Чтобы сгенерировать секретный ключ для шифрования данных, вызовите метод СоздатьСекретныйКлюч типа ГенераторСекретногоКлюча или ГенераторСекретногоКлючаНаОсновеПароля.
метод СгенерироватьКлюч()
// Генерация секретного ключа с использованием алгоритма AES-256.
знч ГенераторКлюча = новый ГенераторСекретногоКлюча(АлгоритмСимметричногоШифрования.Aes,
РазмерКлюча = 256)
знч СекретныйКлюч = ГенераторКлюча.СоздатьСекретныйКлюч()
;
Пример 2. Генерация секретного ключа на основе пароля
метод СгенерироватьКлюч()
// Генерация секретного ключа с использованием алгоритма 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 и т. д.
Основные трансформации, поддерживаемые «1С:Шиной», представлены в
перечислении ПреобразованиеСимметричногоШифрования, но вы также можете
использовать другие типы трансформаций, указав их в виде строки (например,
"AES/CFB/NoPadding"
). В этом случае убедитесь, что данные
трансформации поддерживаются выбранным вами криптопровайдером.
Примеры ниже показывают, как шифровать и расшифровывать данные, используя симметричный алгоритм шифрования AES. В качестве режима шифрования используется режим электронной кодовой книги (ECB), при котором каждый блок открытого текста шифруется независимо от остальных блоков с использованием одного и того же ключа шифрования.
Пример 3. Шифрование данных с помощью статического метода «Зашифровать» типа «ШифрованиеДанных»
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
// Шифрование открытого текста.
// Криптопровайдер будет выбран автоматически.
знч Шифротекст = ШифрованиеДанных.Зашифровать(ОткрытыйТекст, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
возврат Шифротекст
;
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
// Шифрование открытого текста.
// Криптопровайдер будет выбран автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
знч Шифротекст = Шифр.ПолучитьРезультат(ОткрытыйТекст)
возврат Шифротекст
;
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер будет выбран автоматически.
знч ОткрытыйТекст = ШифрованиеДанных.Расшифровать(Шифротекст, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
возврат ОткрытыйТекст
;
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер будет выбран автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, Ключ,
ПреобразованиеСимметричногоШифрования.AesEcb)
знч ОткрытыйТекст = Шифр.ПолучитьРезультат(Шифротекст)
возврат ОткрытыйТекст
;
Асимметричное шифрование
Асимметричное шифрование — это способ шифрования данных, при котором используются два математически связанных ключа — открытый и закрытый. Открытый (публичный) ключ используется для шифрования сообщения, а закрытый (секретный) ключ — для его расшифровки. Данные ключи являются равнозначными, то есть, если открытый ключ используется для шифрования данных, расшифровать их можно только с помощью закрытого ключа. И наоборот, если закрытый ключ используется для шифрования, выполнить расшифровку можно будет только с помощью открытого ключа.
«1С:Шина» поддерживает наиболее распространенный алгоритм асимметричного шифрования — RSA, основывающийся на вычислительной сложности задачи факторизации больших полупростых чисел. Вы также можете использовать другие асимметричные алгоритмы, предназначенные для шифрования данных. Для этого вам необходимо установить сторонний криптопровайдер, содержащий реализацию данного алгоритма. Например, если вы хотите использовать алгоритм ElGamal, установите криптопровайдер Bouncy Castle.
Используйте метод СоздатьПаруКлючей типа ГенераторПарыКлючей, чтобы сгенерировать пару открытого и закрытого ключей асимметричного шифрования. Этот метод позволяет вам указать алгоритм шифрования и размер ключа. Вы также можете использовать упрощенный метод СоздатьПаруКлючейRsa, чтобы создать пару ключей шифрования по алгоритму RSA.
Пример 1. Генерация пары ключей шифрования
метод СгенерироватьКлючи()
// Генерация ключей шифрования с использованием алгоритма RSA.
знч КлючиШифрования = новый ГенераторПарыКлючей(Алгоритм=АлгоритмАсимметричногоШифрования.Rsa,
РазмерКлюча = 1024).СоздатьПаруКлючей()
знч ОткрытыйКлюч = КлючиШифрования.ОткрытыйКлюч
знч ЗакрытыйКлюч = КлючиШифрования.ЗакрытыйКлюч
;
После того как ключи шифрования получены, вы можете приступить к шифрованию/расшифровке данных, как показано в примерах ниже.
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
// Шифрование текста открытым ключом с использованием алгоритма RSA.
// Криптопровайдер будет выбран автоматически.
возврат ШифрованиеДанных.Зашифровать(ОткрытыйТекст, ОткрытыйКлюч, "RSA")
;
Пример 3. Шифрование данных с помощью метода «ПолучитьРезультат» типа «ШифрованиеДанных»
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
// Шифрование текста открытым ключом.
// Криптопровайдер будет выбран автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, ОткрытыйКлюч, "RSA")
возврат Шифр.ПолучитьРезультат(ОткрытыйТекст)
;
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
// Расшифровка зашифрованного текста с использованием алгоритма RSA.
// Криптопровайдер будет выбран автоматически.
возврат ШифрованиеДанных.Расшифровать(Шифротекст, ЗакрытыйКлюч, "RSA")
;
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
// Расшифровка зашифрованного текста.
// Криптопровайдер будет выбран автоматически.
знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, ЗакрытыйКлюч, "RSA")
возврат Шифр.ПолучитьРезультат(Шифротекст)
;