Skip to content

Commit 8642b9e

Browse files
committed
Добавили новую статью Шифрование данных
1 parent 83212c0 commit 8642b9e

3 files changed

Lines changed: 153 additions & 0 deletions

File tree

pages/security/cipher.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
---
2+
title: Шифрование данных
3+
description: 'Шифрование данных. Руководство по безопасности Bitrix: защита, рекомендации и правильные настройки.'
4+
---
5+
6+
Класс `Bitrix\Main\Security\Cipher` реализует симметричное шифрование данных в Bitrix Framework. Подходит для защиты конфиденциальной информации: токенов, ключей или пользовательских данных, которые нужно хранить в зашифрованном виде.
7+
8+
Класс использует расширение PHP OpenSSL для выполнения криптографических операций. По умолчанию применяет два алгоритма:
9+
10+
- `aes-256-ctr` — для шифрования данных,
11+
12+
- `sha256` — для контроля целостности данных.
13+
14+
## Конструктор класса
15+
16+
Конструктор проверяет доступность OpenSSL и поддерживаемые алгоритмы. При ошибке он выбрасывает исключение `SecurityException`.
17+
18+
```php
19+
public function __construct($cipherAlgorithm = 'aes-256-ctr', $hashAlgorithm = 'sha256', $calculateHash = true)
20+
```
21+
22+
- `$cipherAlgorithm` — алгоритм шифрования. По умолчанию — `'aes-256-ctr'`. Получить список доступных алгоритмов можно функцией `openssl_get_cipher_methods()`.
23+
24+
- `$hashAlgorithm` — алгоритм для контроля целостности. По умолчанию — `'sha256'`. Получить список доступных алгоритмов можно функцией `openssl_get_md_methods()`.
25+
26+
- `$calculateHash` — включить контроль целостности. По умолчанию контроль включен `true`.
27+
28+
Контроль целостности проверяет, что данные не изменились после шифрования. Если отключить контроль `$calculateHash = false`, метод шифрования не сможет обнаружить ошибку при неверном ключе.
29+
30+
## Зашифровать данные
31+
32+
Метод `encrypt($data, $key)` шифрует строку и возвращает бинарные данные.
33+
34+
- `$data` — строка для шифрования.
35+
36+
- `$key` — ключ шифрования. Используйте надежный ключ — длинную случайную строку. Можно сгенерировать с помощью `\Bitrix\Main\Security\Random::getString(32)`.
37+
38+
```php
39+
$cipher = new \Bitrix\Main\Security\Cipher();
40+
$cryptoKey = \Bitrix\Main\Security\Random::getString(32);
41+
42+
// encrypt() возвращает бинарные данные
43+
$encrypted = $cipher->encrypt('Секретные данные', $cryptoKey);
44+
```
45+
46+
{% note warning "" %}
47+
48+
Ключ шифрования должен храниться отдельно от зашифрованных данных — например, в переменных окружения или защищенном хранилище. Не храните ключ в открытом виде рядом с данными.
49+
50+
{% endnote %}
51+
52+
В процессе шифрования метод выполняет несколько шагов.
53+
54+
1. Создает случайный вектор инициализации.
55+
56+
2. Вычисляет хеш-код от конкатенации вектора инициализации и ключа.
57+
58+
3. Вычисляет хеш исходных данных и добавляет его перед шифрованием, если включен контроль целостности.
59+
60+
4. Шифрует данные алгоритмом, который установил пользователь.
61+
62+
5. Возвращает вектор инициализации и зашифрованные данные.
63+
64+
Вектор инициализации всегда разный, поэтому одинаковые данные при одном и том же ключе шифруются по-разному.
65+
66+
## Расшифровать данные
67+
68+
Метод `decrypt($data, $key)` расшифровывает данные и возвращает исходную строку.
69+
70+
- `$data` — бинарные данные от метода `encrypt()`.
71+
72+
- `$key` — ключ шифрования. Указывайте тот же, что при шифровании.
73+
74+
```php
75+
$decrypted = $cipher->decrypt($encrypted, $cryptoKey);
76+
77+
// Результат должен совпадать с исходными данными
78+
echo $decrypted; // Секретные данные
79+
```
80+
81+
Метод выполняет шаги, обратные шифрованию.
82+
83+
1. Извлекает вектор инициализации из данных.
84+
85+
2. Вычисляет хеш-код от конкатенации вектора инициализации и ключа.
86+
87+
3. Расшифровывает данные.
88+
89+
4. Проверяет хеш данных, если контроль целостности включен.
90+
91+
5. Возвращает исходную строку.
92+
93+
Если хеш не совпадает, метод возвращает исключение `SecurityException`.
94+
95+
## Как хранить зашифрованные данные
96+
97+
Так как метод `encrypt()` возвращает бинарные данные, перед сохранением в базу данных их нужно преобразовать в текстовый формат. Для этого используйте кодирование в `base64`.
98+
99+
```php
100+
// Шифруем и кодируем в base64
101+
$encrypted = $cipher->encrypt($data, $cryptoKey);
102+
$encoded = base64_encode($encrypted);
103+
104+
// Декодируем и расшифровываем
105+
$decoded = base64_decode($encoded);
106+
$decrypted = $cipher->decrypt($decoded, $cryptoKey);
107+
```
108+
109+
## Обработка ошибок
110+
111+
Класс `Cipher` выбрасывает исключение `SecurityException`:
112+
113+
- если расширение OpenSSL не доступно,
114+
115+
- передан неподдерживаемый алгоритм,
116+
117+
- не удалось создать вектор инициализации,
118+
119+
- произошла ошибка при шифровании или расшифровке,
120+
121+
- не совпал хеш данных при включенном контроле целостности.
122+
123+
Обрабатывайте ошибки с помощью `try/catch`.
124+
125+
```php
126+
try
127+
{
128+
$cipher = new \Bitrix\Main\Security\Cipher();
129+
130+
$originalData = 'Конфиденциальная информация';
131+
$cryptoKey = \Bitrix\Main\Security\Random::getString(32);
132+
133+
// Шифруем данные
134+
$encryptedData = $cipher->encrypt($originalData, $cryptoKey);
135+
136+
// Расшифровываем данные
137+
$decryptedData = $cipher->decrypt($encryptedData, $cryptoKey);
138+
139+
// Результат должен совпадать с исходными данными
140+
echo $decryptedData; // Конфиденциальная информация
141+
}
142+
catch(\Bitrix\Main\Security\SecurityException $e)
143+
{
144+
// Обрабатываем ошибку
145+
echo 'Ошибка шифрования: ' . $e->getMessage();
146+
}
147+
```

toc.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ items:
242242
href: /pages/security/proactive-security.md
243243
- name: Двухэтапная авторизация
244244
href: /pages/security/two-factor-auth.md
245+
- name: Шифрование данных
246+
href: /pages/security/cipher.md
245247

246248
- name: Производительность
247249
items:

whats-new.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ title: Что нового
2020

2121
### 2026
2222

23+
#### 26 марта
24+
25+
- Добавили новую статью [Шифрование данных](./pages/security/cipher.md).
26+
2327
#### 20 марта
2428

2529
- Добавили новую статью [HTTP-клиент](./pages/advanced/http-client.md).

0 commit comments

Comments
 (0)