Шифрование данных

Шифрование — это основной способ защиты данных при их передаче и хранении, который позволяет предотвратить чтение или изменение информации третьими лицами.

позволяет вам шифровать и расшифровывать данные, используя симметричные и асимметричные алгоритмы шифрования.

Примечание: не содержит собственные реализации алгоритмов шифрования, а использует криптографический фреймворк Java Cryptography Architecture (JCA). Вы также можете использовать модули криптографии сторонних производителей (Bouncy Castle, КриптоПро), предварительно установив их на сервере.
Для шифрования или расшифровки данных в коде используйте один из следующих способов:
  • Если вам требуется зашифровать или расшифровать небольшой объем данных, вызовите статический метод Зашифровать или Расшифровать типа ШифрованиеДанных.
  • Если вы работаете с большим объемом информации, вы можете шифровать/расшифровывать данные частями. Для этого создайте экземпляр типа ШифрованиеДанных и используйте методы ДобавитьДанные и ПолучитьРезультат.

Симметричное шифрование

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

  • Блочные — шифруют данные блоками определенной длины (как правило, 64 или 128 бит). Если исходный текст или его последняя часть меньше размера блока, то его дополняют, чтобы привести к нужной длине. Примеры блочных шифров: AES, Blowfish, DES, Triple DES, RC2.
  • Потоковые — шифруют каждый бит или байт исходного текста с использованием гаммирования (наложения последовательности, состоящей из случайных чисел, на открытый текст). Примеры потоковых шифров: RC4, SEAL, WAKE.

Перечисление АлгоритмСимметричногоШифрования содержит основные алгоритмы шифрования, поддерживаемые в . Вы также можете использовать и другие алгоритмы, которые поддерживаются вашим криптопровайдером. Для этого укажите название необходимого алгоритма в виде строки (например, "RC4").

Чтобы сгенерировать секретный ключ для шифрования данных, вызовите метод СоздатьСекретныйКлюч типа ГенераторСекретногоКлюча или ГенераторСекретногоКлючаНаОсновеПароля.

Пример 1. Генерация секретного ключа
метод СгенерироватьКлюч()
    // Генерация секретного ключа с использованием алгоритма 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 и т. д.

Основные трансформации, поддерживаемые , представлены в перечислении ПреобразованиеСимметричногоШифрования, но вы также можете использовать другие типы трансформаций, указав их в виде строки (например, "AES/CFB/NoPadding"). В этом случае убедитесь, что данные трансформации поддерживаются выбранным вами криптопровайдером.

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

Пример 3. Шифрование данных с помощью статического метода «Зашифровать» типа «ШифрованиеДанных»

метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
    // Шифрование открытого текста.
    // Криптопровайдер будет выбран автоматически.
    знч Шифротекст = ШифрованиеДанных.Зашифровать(ОткрытыйТекст, Ключ, 
                                                  ПреобразованиеСимметричногоШифрования.AesEcb)
    возврат Шифротекст
;
Пример 4. Шифрование данных с помощью метода «ПолучитьРезультат» типа «ШифрованиеДанных»
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, Ключ: СекретныйКлюч): Байты
    // Шифрование открытого текста.
    // Криптопровайдер будет выбран автоматически.
    знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, Ключ, 
                                      ПреобразованиеСимметричногоШифрования.AesEcb)
    знч Шифротекст = Шифр.ПолучитьРезультат(ОткрытыйТекст)
    возврат Шифротекст
;
Пример 5. Расшифровка данных с помощью статического метода «Расшифровать» типа «ШифрованиеДанных»
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
    // Расшифровка зашифрованного текста.
    // Криптопровайдер будет выбран автоматически.
    знч ОткрытыйТекст = ШифрованиеДанных.Расшифровать(Шифротекст, Ключ, 
                                                      ПреобразованиеСимметричногоШифрования.AesEcb)
    возврат ОткрытыйТекст
;
Пример 6. Расшифровка данных с помощью метода «ПолучитьРезультат» типа «ШифрованиеДанных»
метод РасшифроватьДанные(Шифротекст: Байты, Ключ: СекретныйКлюч): Байты
    // Расшифровка зашифрованного текста.
    // Криптопровайдер будет выбран автоматически.
    знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, Ключ, 
                                      ПреобразованиеСимметричногоШифрования.AesEcb)
    знч ОткрытыйТекст = Шифр.ПолучитьРезультат(Шифротекст)
    возврат ОткрытыйТекст
;

Асимметричное шифрование

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

поддерживает наиболее распространенный алгоритм асимметричного шифрования — RSA, основывающийся на вычислительной сложности задачи факторизации больших полупростых чисел. Вы также можете использовать другие асимметричные алгоритмы, предназначенные для шифрования данных. Для этого вам необходимо установить сторонний криптопровайдер, содержащий реализацию данного алгоритма. Например, если вы хотите использовать алгоритм ElGamal, установите криптопровайдер Bouncy Castle.

Используйте метод СоздатьПаруКлючей типа ГенераторПарыКлючей, чтобы сгенерировать пару открытого и закрытого ключей асимметричного шифрования. Этот метод позволяет вам указать алгоритм шифрования и размер ключа. Вы также можете использовать упрощенный метод СоздатьПаруКлючейRsa, чтобы создать пару ключей шифрования по алгоритму RSA.

Пример 1. Генерация пары ключей шифрования

метод СгенерироватьКлючи()
    // Генерация ключей шифрования с использованием алгоритма RSA.
    знч КлючиШифрования = новый ГенераторПарыКлючей(Алгоритм=АлгоритмАсимметричногоШифрования.Rsa,
                                                    РазмерКлюча = 1024).СоздатьПаруКлючей()
    знч ОткрытыйКлюч = КлючиШифрования.ОткрытыйКлюч
    знч ЗакрытыйКлюч = КлючиШифрования.ЗакрытыйКлюч
;

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

Пример 2. Шифрование данных с помощью статического метода «Зашифровать» типа «ШифрованиеДанных»
метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
    // Шифрование текста открытым ключом с использованием алгоритма RSA.
    // Криптопровайдер будет выбран автоматически.
    возврат ШифрованиеДанных.Зашифровать(ОткрытыйТекст, ОткрытыйКлюч, "RSA")
;

Пример 3. Шифрование данных с помощью метода «ПолучитьРезультат» типа «ШифрованиеДанных»

метод ЗашифроватьДанные(ОткрытыйТекст: Байты, ОткрытыйКлюч: ОткрытыйКлюч): Байты
    // Шифрование текста открытым ключом.
    // Криптопровайдер будет выбран автоматически.
    знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Зашифровать, ОткрытыйКлюч, "RSA")
    возврат Шифр.ПолучитьРезультат(ОткрытыйТекст)
;
Пример 4. Расшифровка данных с помощью статического метода «Расшифровать» типа «ШифрованиеДанных»
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
    // Расшифровка зашифрованного текста с использованием алгоритма RSA.
    // Криптопровайдер будет выбран автоматически.
    возврат ШифрованиеДанных.Расшифровать(Шифротекст, ЗакрытыйКлюч, "RSA")
;
Пример 5. Расшифровка данных с помощью метода «ПолучитьРезультат» типа «ШифрованиеДанных»
метод РасшифроватьДанные(Шифротекст: Байты, ЗакрытыйКлюч: ЗакрытыйКлюч): Байты
    // Расшифровка зашифрованного текста.
    // Криптопровайдер будет выбран автоматически.
    знч Шифр = новый ШифрованиеДанных(ОперацияШифрования.Расшифровать, ЗакрытыйКлюч, "RSA")
    возврат Шифр.ПолучитьРезультат(Шифротекст)
;

Вычисление кода аутентификации сообщения с использованием алгоритма HMAC

В реализован механизм вычисления кода аутентификации сообщения с помощью хеш-функции — HMAC. Использование HMAC позволяет гарантировать, что сообщение не было модифицировано и исходит от подлинного источника.

Чтобы вычислить код аутентификации сообщения с помощью хеш-функции, используйте объект типа ВычислительHmac:
// Создание объекта типа ВычислительHmac
// с применением ключа "СекретныйКлюч" и алгоритма хеширования SHA256
// и вычисление кода аутентификации для строки "12345678900987654321"

знч Вычислитель = новый ВычислительHmac("СекретныйКлюч".ВБайты(), АлгоритмХеширования.Sha256)
знч Результат = Вычислитель.ПолучитьРезультат("12345678900987654321".ВБайты())
В объект типа ВычислительHmac можно добавлять данные частями, используя метод ДобавитьДанные(), а затем вычислить результат HMAC для всех добавленных данных с помощью метода ПолучитьРезультат():
знч Вычислитель = новый ВычислительHmac("СекретныйКлюч".ВБайты(),
                                        АлгоритмХеширования.Sha256)
Вычислитель.ДобавитьДанные("1234567890".ВБайты())
Вычислитель.ДобавитьДанные("0987654321".ВБайты())
знч Результат = Вычислитель.ПолучитьРезультат()
Метод ПолучитьРезультат() в качестве параметра может принимать поток данных:
исп Поток = новый Файл("<Путь к файлу>").ПолучитьПотокЧтения()
знч Вычислитель = новый ВычислительHmac("СекретныйКлюч".ВБайты(),
                                        АлгоритмХеширования.Sha256)
знч Результат = Вычислитель.ПолучитьРезультат(Поток)
Для небольшого объема данных используется статический метод Вычислить():
знч РезультатСтатический = ВычислительHmac.Вычислить("1234567890".ВБайты(),
                                                     "Ключ".ВБайты(),
                                                     АлгоритмХеширования.Sha256)