Recommend this page to a friend! |
Download .zip |
Info | Documentation | View files (25) | Download .zip | Reputation | Support forum | Blog (1) | Links |
Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
2024-03-06 (2 months ago) | Not enough user ratings | Total: 28 | All time: 11,100 This week: 78 |
Version | License | PHP version | Categories | |||
encryptbundle 1.0 | MIT/X Consortium ... | 8.2 | Cryptography, Libraries, Templates, S..., P... |
Install with composer: composer require psolutions/encrypt-bundle
A bundle to handle encoding and decoding of parameters using OpenSSL and Doctrine lifecycle events. It's a fork of https://github.com/mogilvie/EncryptBundle
Features include: - v1 is Symfony 6.4 and 7.0 compatible. - Uses OpenSSL - Uses Event listeners
Features road map:
This bundle is under the MIT license. See the complete license in the bundle:
Resources/meta/LICENSE
EncryptBundle has been written for the Parolla Plugins and Parolla websites to encode users private data. The bundle is expanded in a larger gdpr-bundle.
Issues and feature requests are tracked in the Github issue tracker.
When reporting a bug, it may be a good idea to reproduce it in a basic project built using the Symfony Standard Edition to allow developers of the bundle to reproduce the issue by simply cloning it and following some steps.
Open a command console, enter your project directory and execute the following command to download the latest development version of this bundle:
$ composer require psolutions/encrypt-bundle
The receipe will create a package config file under config/packages/psolutions_encrypt.yaml.
If required, enable the bundle by adding it to the list of registered bundles
in the config/bundles.php
file of your project:
<?php
return [
...
PSolutions\EncryptBundle\PSolutionsEncryptBundle::class => ['all' => true],
];
Generate a 256-bit key using the command provided in the bundle.
$ bin/console encrypt:genkey
Copy the key into your .env file.
###> encrypt-bundle ###
PSOLUTIONS_ENCRYPT_KEY= change_me!
###< encrypt-bundle ###
Maker will have created a packages yaml file. The key is resolved in there.
# app/config/packages/psolutions_encrypt.yaml
psolutions_encrypt:
encrypt_key: '%env(PSOLUTIONS_ENCRYPT_KEY)%'
is_disabled: false # Turn this to true to disable the encryption.
connections: # Optional, define the connection name(s) for the subscriber to listen to.
- 'default'
- 'tenant'
encryptor_class: App\Encryptors\MyCustomEncryptor # Optional to override the bundle OpenSslEncryptor.
annotation_classes: # Optional to override the default annotation/Attribute object.
- App\Annotation\MyAttribute
You can disable encryption by setting the 'is_disabled' option to true. Decryption still continues if any values contain the \<ENC> suffix.
If you want to define your own annotation/attribute, then this can be used to trigger encryption by adding the annotation class name to the 'annotation_classes' option array.
You can pass the class name of your own encyptor service using the optional encryptorClass option.
The EncryptKey can be set via a dispatched event listener, which overrides any .env or param.yml defined key. Create a listener for the EncryptKeyEvents::LOAD_KEY event and set your encryption key at that point.
Add the Encrypted attribute class within the entity.
<?php
...
use PSolutions\EncryptBundle\Annotations\Encrypted;
Add the attribute #[Encrypted] to the properties you want encrypted.
<?php
#[Encrypted]
#[Column]
protected string $taxNumber;
#[Column(type: string, nullable: true)]
#[Encrypted]
protected ?bool $isSelfEmployed;
/
* Date of birth
*/
#[Encrypted]
#[Column]
protected ?String $dob;
Where encrypting a field you will need to set the column type as string.
Your getters and setters may also need to be type declared.
For example, boolean should either be return declared bool, or return a bool using a ternary method.
<?php
/
* Get isSelfEmployed
*
* @return boolean
*/
public function isSelfEmployed(): bool
{
return $this->isSelfEmployed;
}
/
* Get isSelfEmployed
*
* @return boolean
*/
public function isSelfEmployed(): bool
{
return ($this->isSelfEmployed == 1 ? true: false);
}
For DateTime parameters store the date as a string, and use the getters and setters to convert that string.
You may also need to create a DataTransformer if you are using the parameter in a form with the DateType form type.
The bundle comes with an DoctrineEncryptListener. This listener catches the doctrine events onLoad, onFlush and postFlush.
The onLoad event listener will decrypt your entity parameter at loading. This means that your forms and form fields will already be decrypted.
The onFlush and postFlush event listeners will check if encryption is enabled, and encrypt the data before entry to the database.
So, in normal CRUD operation you do not need to do anything in the controller for encrypting or decrypting the data.
You can of course inject the EncryptorInterface service any time into classes either by using autowiring or defining the injection in your service definitions.
<?php
use PSolutions\EncryptBundle\Encryptors\EncryptorInterface;
// Inject the Encryptor from the service container at class construction
public function __construct(private readonly EncryptorInterface $encryptor)
{
}
// Inject the Encryptor in controller actions.
public function editAction(EncryptorInterface $encryptor)
{
...
// An example encrypted value, you would get this from your database query.
$encryptedValue = "3DDOXwqZAEEDPJDK8/LI4wDsftqaNCN2kkyt8+QWr8E=<ENC>";
$decrypted = $encryptor->decrypt($encryptedValue);
...
}
Or you can dispatch the EncryptEvent.
<?php
...
use PSolutions\EncryptBundle\Event\EncryptEvent;
use PSolutions\EncryptBundle\Event\EncryptEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
...
public function indexAction(EventDispatcherInterface $dispatcher)
{
...
// An example encrypted value, you would get this from your database query.
$event = new EncryptEvent("3DDOXwqZAEEDPJDK8/LI4wDsftqaNCN2kkyt8+QWr8E=<ENC>");
$dispatcher->dispatch(EncryptEvents::DECRYPT, $event);
$decrypted = $event->getValue();
}
If you query a repository using a select with an array result then the doctrine onLoad event subscriber will not decrypt any encrypted values.
In this case, use the twig filter to decrypt your value when rendering.
{{ employee.bankAccountNumber | decrypt }}
You have already seen the command to generate a encryption key:
$ bin/console encrypt:genkey
You can decrypt/encrypt the entire database using the following
$ bin/console encrypt:database decrypt connection
The requried argument should be be decrypt or encrypt.
There is an option to define the database connection if you employ multiple connections in your application.
Files |
File | Role | Description | ||
---|---|---|---|---|
.github (1 file) | ||||
config (1 file) | ||||
src (1 file, 7 directories) | ||||
tests (1 directory) | ||||
translations (1 file) | ||||
CHANGELOG.md | Data | Auxiliary data | ||
composer.json | Data | Auxiliary data | ||
README.md | Doc. | Read me |
Files | / | src |
File | Role | Description | ||
---|---|---|---|---|
Annotations (1 file) | ||||
Command (2 files) | ||||
Encryptors (3 files) | ||||
Event (5 files) | ||||
EventListener (3 files) | ||||
Exception (1 file) | ||||
Twig (1 file) | ||||
PSolutionsEncryptBundle.php | Class | Class source |
Files | / | src | / | Command |
File | Role | Description |
---|---|---|
EncryptDatabaseCommand.php | Class | Class source |
GenKeyCommand.php | Class | Class source |
Files | / | src | / | Encryptors |
File | Role | Description |
---|---|---|
EncryptorFactory.php | Class | Class source |
EncryptorInterface.php | Class | Class source |
OpenSslEncryptor.php | Class | Class source |
Files | / | src | / | Event |
File | Role | Description |
---|---|---|
EncryptEvent.php | Class | Class source |
EncryptEventInterface.php | Class | Class source |
EncryptEvents.php | Class | Class source |
EncryptKeyEvent.php | Class | Class source |
EncryptKeyEvents.php | Class | Class source |
Files | / | src | / | EventListener |
File | Role | Description |
---|---|---|
DoctrineEncryptListener.php | Class | Class source |
DoctrineEncryptListenerInterface.php | Class | Class source |
EncryptEventListener.php | Class | Class source |
Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
100% |
|
|
Applications that use this package |
If you know an application of this package, send a message to the author to add a link here.