Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Cryptography translated into Russian #201

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions guide/ru/security/cryptography.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# Криптография

В этом разделе мы рассмотрим следующие аспекты безопасности:

- Генерация случайных данных
- Шифрование и расшифровка
- Проверка целостности данных

Для использования этих функций, вам нужно установить пакет `yiisoft/security`:

```
composer install yiisoft/security
```

## Генерация псевдослучайных данных

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

Класс `\Yiisoft\Security\Random` делает генерацию псевдослучайных данных простой:

```php
$key = \Yiisoft\Security\Random::string(42);
```

Код выше даст вам случайную строку, включающую 42 символа.

Если вам нужны байты или целые числа, напрямую используйте функции PHP:

- `random_bytes()` для байт. Обратите внимание, что вывод может быть не ASCII.
- `random_int()` для целых чисел.

## Шифрование и расшифровка

Yii предоставляет удобные вспомогательные функции для шифрования/расшифровки данных с помощью секретного кллюча.
Данные проходят через функцию шифрования таким образом, что только тот, кто знает секретный ключ, может расшифровать их.
Например, вам нужно сохранить некоторую информацию в вашей базе данных, но вы должны быть уверены, что только пользователь, который знает секретный ключ, сможет расшифровать их (даже если кто-нибудь скомпрометирует базу данных приложения)

```php
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByPassword($data, $password);

// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);
```

Расшифровка:

```php
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();

$data = (new \Yiisoft\Security\Crypt())->decryptByPassword($encryptedData, $password);
```

Вы можете использовать ключ вместо пароля:

```php
$encryptedData = (new \Yiisoft\Security\Crypt())->encryptByKey($data, $key);

// сохранение данных в базу данных или другое хранилище
saveData($encryptedData);
```

Расшифровка:

```php
// получение зашифрованных данных из базы данных или другого хранилища
$encryptedData = getEncryptedData();

$data = (new \Yiisoft\Security\Crypt())->decryptByKey($encryptedData, $key);
```

## Проверка целостности данных

Бывают ситуации, когда вам необходимо убедиться, что ваши данные не были подделаны третьей стороной или испорчены каким-то образом.
Yii предоставляет способ проверить целостность данных по MAC подписи.

Ключ `$key` должен присутствовать как на отправляющей, так и на принимающей стороне. На отправляющей стороне:

```php
$signedMessage = (new \Yiisoft\Security\Mac())->sign($message, $key);

sendMessage($signedMessage);
```

На принимающей стороне:

```php
$signedMessage = receiveMessage($signedMessage);

try {
$message = (new \Yiisoft\Security\Mac())->getMessage($signedMessage, $key);
} catch (\Yiisoft\Security\DataIsTamperedException $e) {
// данные подделаны
}
```

## Маскировка длины токена

Маскировка токена помогает смягчить атаку BREACH за счет рандомизации способа вывода токена при каждом запросе. К токену применяется случайная маска, делающая строку всегда уникальной.

Для маскировки токена:

```php
$maskedToken = \Yiisoft\Security\TokenMask::apply($token);
```

Получить исходное начение из замаскированного:

```php
$token = \Yiisoft\Security\TokenMask::remove($maskedToken);
```
Loading