Secciones

Componente Crypt


Resumen

NOTA: Requiere que la extensión PHP openssl esté presente en el sistema

NO soporta algoritmos inseguros con modos:

des*, rc2*, rc4*, des*, *ecb

Phalcon proporciona servicios de encriptación vía componente Phalcon\Crypt. Esta clase ofrece envolturas simples orientadas a objeto a la librería de encriptación PHP openssl.

Por defecto, este componente usa el cifrado AES-256-CFB.

El cifrado AES-256 se usa, entre otros lugares, en SSL/TLS a través de Internet. Se considera de los mejores cifrados. En teoría no es crackeable ya que las combinaciones de claves son masivas. Aunque la NSA lo ha categorizado en Suite B, también han recomendado usar claves más grandes de 128-bit para encriptación.

NOTA: Debe usar un tamaño de clave correspondiente al algoritmo actual. Para el algoritmo predeterminado aes-256-cfb el tamaño de clave predeterminado es de 32 bytes.

Uso básico

Este componente se ha diseñado para ser muy simple de usar:

<?php

use Phalcon\Crypt;

$key = "12345"; // Your luggage combination

$crypt     = new Crypt();
$text      = 'This is the text that you want to encrypt.';
$encrypted = $crypt->encrypt($text, $key);

echo $crypt->decrypt($encrypted, $key);

Si no se pasan parámetros en el constructor, el componente usará el cifrado aes-256-cfb con la firma por defecto. Siempre puede cambiar el cifrado así como desactivar al firma.

<?php

use Phalcon\Crypt;

$key   = "12345"; // Your luggage combination
$crypt = new Crypt();

$crypt
    ->setCipher('aes256')
    ->useSigning(false)
;

$text      = 'This is the text that you want to encrypt.';
$encrypted = $crypt->encrypt($text, $key);

echo $crypt->decrypt($encrypted, $key);

Encriptar

El método encrypt() encripta una cadena. El componente usará el cifrado establecido previamente, que se ha establecido en el constructor o explícitamente. Si no se pasa key en el parámetro, se usará la clave previamente configurada.

<?php

use Phalcon\Crypt;

$key   = "12345"; // Your luggage combination
$crypt = new Crypt();
$crypt->setKey($key);

$text      = 'This is the text that you want to encrypt.';
$encrypted = $crypt->encrypt($text);

o usando la clave como segundo parámetro

<?php

use Phalcon\Crypt;

$key       = "12345"; // Your luggage combination
$crypt     = new Crypt();
$text      = 'This is the text that you want to encrypt.';
$encrypted = $crypt->encrypt($text, $key);

El método también usará internamente la firma por defecto. Siempre puede usar useSigning(false) antes de la llamada al método para deshabilitarla.

**NOTA: Si elige cifrados relativos a ccm o gcm, debe también proporcionar authData para ellos. De lo contrario se lanzará una excepción.

Desencriptar

El método decrypt() desencripta una cadena. Similar a encrypt() el componente usará el cifrado previamente configurado, que puede haber sido establecido en el constructor o explícitamente. Si no se pasa key en el parámetro, se usará la clave previamente configurada.

<?php

use Phalcon\Crypt;

$key   = "12345"; // Your luggage combination
$crypt = new Crypt();
$crypt->setKey($key);

$text      = 'T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3';
$encrypted = $crypt->decrypt($text);

o usando la clave como segundo parámetro

<?php

use Phalcon\Crypt;

$key   = "12345"; // Your luggage combination
$crypt = new Crypt();
$crypt->setKey($key);

$text      = 'T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3';
$encrypted = $crypt->decrypt($text, $key);

El método también usará internamente la firma por defecto. Siempre puede usar useSigning(false) antes de la llamada al método para deshabilitarla.

Encriptar en Base64

Se puede usar encryptBase64() para encriptar una cadena de una manera amigable con URL. Internamente usa encrypt() y acepta text y opcionalmente la key del elemento a encriptar. También hay un tercer parámetro safe (por defecto false) que realizará sustituciones de cadena para los caracteres no amigables en URL como + o /.

Desencriptar en Base64

Se puede usar decryptBase64() para desencriptar una cadena de una manera amigable con URL. De forma similar a encryptBase64() usa decrypt() internamente y acepta el text y opcionalmente la key del elemento a desencriptar. También hay un tercer parámetro safe (por defecto false) que realizará sustituciones de cadena para los caracteres no amigables en URL previamente reemplazados como + o /.

Excepciones

Las excepciones lanzadas en el componente Phalcon\Crypt serán del tipo [Phalcon\Crypt\Exception][config-exception]. Sin embargo, si está usando firma y el hash calculado para decrypt() no coincide, se lanzará Phalcon\Crypt\Mismatch. Puede usar estas excepciones para capturar selectivamente sólo las excepciones lanzadas desde este componente.

<?php

use Phalcon\Crypt\Mismatch;
use Phalcon\Mvc\Controller;

class IndexController extends Controller
{
    public function index()
    {
        try {
            // Get some configuration values
            $this->crypt->decrypt('hello');
        } catch (Mismatch $ex) {
            echo $ex->getMessage();
        }
    }
}

Funcionalidad

Cifrados

getCipher() devuelve el cifrado seleccionado actualmente. Si no se ha definido ninguno explícitamente mediante setCipher() o el constructor del objeto se seleccionará aes-256-cfb por defecto. aes-256-gcm es el cifrado preferido.

Siempre puede obtener un vector con todos los cifrados disponibles en su sistema llamando a getAvailableCiphers().

Algoritmo Hash

getHashAlgo() devuelve el algoritmo de hash que usa el componente. Si no se ha definido ninguno explícitamente mediante setHashAlgo() se usará sha256. Si no está disponible en el sistema el algoritmo de hash definido o es incorrecto, se lanzará [Phalcon\Crypt\Exception][crypt=exception].

Siempre puede obtener un vector con todos los algoritmos de hash disponibles en su sistema llamando a getAvailableHashAlgos().

Claves

El componente ofrece un getter y un setter para la clave a usar. Una vez configurada la clave, se usará para cualquier operación de encriptado o desencriptado (siempre que no se defina el parámetro key cuando use estos métodos).

  • getKey(): Devuelve la clave de encriptación.
  • setKey() Establece la clave de encriptación.

Siempre debería crear las claves lo más seguras posible. 12345 podría ser buena para su combinación de equipaje, o password1 para su email, pero para su aplicación debería intentar algo mucho más complejo. Cuanto más larga y más aleatoria sea la clave, mejor. Por supuesto, el tamaño depende del cifrado elegido.

Varios servicios online pueden generar un texto aleatorio y fuerte que se puede usar como clave. Alternativamente, siempre puede usar los métodos hash() del componente Phalcon\Security, que pueden ofrecer una clave fuerte al hacer hash de una cadena.

Firma

Para indicar al componente que use la firma o no, está disponible useSigning. Acepta un booleano que establece un parámetro internamente, que indica si la firma se debe usar o no.

Datos de Autenticación

Si el cifrado seleccionado es del tipo gcm o ccm (como termina el nombre del cifrado), se necesitan datos de autenticación para el componente para encriptar y desencriptar correctamente los datos. Los métodos disponibles para esa operación son:

  • setAuthTag()
  • setAuthData()
  • setAuthTagLength() - por defecto 16

Relleno

Puede establecer el relleno a usar por el componente usando setPadding(). Por defecto, el componente usará PADDING_DEFAULT. Las constantes de rellenos disponibles son:

  • PADDING_ANSI_X_923
  • PADDING_DEFAULT
  • PADDING_ISO_10126
  • PADDING_ISO_IEC_7816_4
  • PADDING_PKCS7
  • PADDING_SPACE
  • PADDING_ZERO

Inyección de Dependencias

Como en la mayoría de componentes Phalcon, puede almacenar el objeto Phalcon\Crypt en su contenedor Phalcon\Di. Al hacerlo, podrá acceder a su objeto de configuración desde controladores, modelos, vistas y cualquier componente que implemente Injectable.

A continuación, un ejemplo de registro del servicio así como de acceso a él:

<?php

use Phalcon\Di\FactoryDefault;
use Phalcon\Crypt;

// Create a container
$container = new FactoryDefault();

$container->set(
    'crypt',
    function () {
        $crypt = new Crypt();

        // Set a global encryption key
        $crypt->setKey(
            "T4\xb1\x8d\xa9\x98\x05\\\x8c\xbe\x1d\x07&[\x99\x18\xa4~Lc1\xbeW\xb3"
        );

        return $crypt;
    },
    true
);

El componente está ahora disponible en sus controladores usando la clave crypt

<?php

use MyApp\Models\Secrets;
use Phalcon\Crypt;
use Phalcon\Http\Request;
use Phalcon\Mvc\Controller;

/**
 * @property Crypt   $crypt
 * @property Request $request
 */
class SecretsController extends Controller
{
    public function saveAction()
    {
        $secret = new Secrets();

        $text = $this->request->getPost('text');

        $secret->content = $this->crypt->encrypt($text);

        if ($secret->save()) {
            $this->flash->success(
                'Secret was successfully created!'
            );
        }
    }
}

Enlaces