No sé si es la manera correcta en absoluto, pero lo implementé recientemente creando un custom mapping type, según los documentos de Doctrine. Algo así como lo siguiente:
class EncryptedStringType extends TextType
{
const MYTYPE = 'encryptedstring'; // modify to match your type name
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return base64_decode($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return base64_encode($value);
}
public function getName()
{
return self::MYTYPE;
}
}
Me he registrado este tipo en mi clase de paquete:
class MyOwnBundle extends Bundle
{
public function boot()
{
$em = $this->container->get("doctrine.orm.entity_manager");
try
{
Type::addType("encryptedstring", "My\OwnBundle\Type\EncryptedStringType");
$em->
getConnection()->
getDatabasePlatform()->
registerDoctrineTypeMapping("encryptedstring", "encryptedstring");
} catch (\Doctrine\DBAL\DBALException $e)
{
// For some reason this exception gets thrown during
// the clearing of the cache. I didn't have time to
// find out why :-)
}
}
}
y entonces yo era capaz de hacer referencia al crear mis entidades, por ejemplo:
/**
* @ORM\Column(type="encryptedstring")
* @Assert\NotBlank()
*/
protected $name;
Esta fue una implementación rápida, por lo que me interesaría saber la forma correcta de hacerlo. También supongo que su servicio de cifrado es algo disponible desde el contenedor; No sé qué tan factible/posible sería pasar servicios a tipos personalizados de esta manera tampoco ... :-)
hola, gracias a su respuesta, sin duda es una buena idea, sin embargo me pregunto cómo pude pasar mi clave privada? Digamos que paso mi EncryptionService a mi tipo personalizado usando el constructor, aún necesito pasarle una clave para usar para el cifrado, sin embargo, como el tipo se usa para persistir e hidratar una entidad, no sé cómo podría hacer eso – Trent
Sí, en nuestro caso usamos las funciones 'mcrypt_ *' y codificamos la iv y la frase de contraseña, etc., debido a limitaciones de tiempo, pero no sé si podrías crear el tipo como un servicio y pasar los parámetros de esa manera . ¡Parece ser una falta de información sobre cómo hacer esto de manera eficiente! – richsage
Sí, en realidad estoy usando las funciones mcrypt_ *, pero la clave para encriptar datos se genera dinámicamente, así que no puedo codificarla. – Trent