Non so se è il modo giusto, ma l'ho implementato di recente creando un custom mapping type, come per i documenti Doctrine. Qualcosa di simile a quanto segue:
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;
}
}
ho registrato questo tipo nella mia classe bundle:
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 :-)
}
}
}
e poi sono stato in grado di fare riferimento a quando la creazione i miei soggetti, ad esempio:
/**
* @ORM\Column(type="encryptedstring")
* @Assert\NotBlank()
*/
protected $name;
Questa è stata un'implementazione rapida, quindi sarei interessato a conoscere il modo corretto di farlo. Presumo anche che il tuo servizio di crittografia sia qualcosa disponibile dal container; Non so come possibile/possibile sarebbe quello di passare servizi in tipi personalizzati in questo modo sia ... :-)
ciao, grazie tua risposta, è sicuramente una buona idea, ma mi chiedo come ho potuto passare la mia chiave privata? Diciamo che passo il mio EncryptionService al mio tipo personalizzato usando il costruttore, ho ancora bisogno di passarlo una chiave da usare per la crittografia, tuttavia, poiché il tipo viene usato quando si persiste e si idrata un'entità, non so come potrei fai questo – Trent
Sì, nel nostro caso abbiamo usato le funzioni 'mcrypt_ *' e abbiamo codificato l'iv e la passphrase ecc. a causa di limiti di tempo, ma non so se potresti, ad esempio, creare il tipo come servizio e passare i parametri in quel modo . Sembra essere una mancanza di informazioni su come farlo in modo efficiente! – richsage
Sì, sto effettivamente utilizzando le funzioni mcrypt_ *, ma la chiave per crittografare i dati viene generata dinamicamente, quindi non posso hardcode. – Trent