Symfony Bundle to store files on the database that have been securely encrypted on the client side (browser).

dev-master 2019-10-27 22:04 UTC


Symfony Bundle to store files on the server that have been securely encrypted on the client side (browser).

Meta-Data is stored in the database, the file-content is stored on the file-system.

Uses vanilla JS and Stanford Javascript Crypto Library (See


  • Upload password protected encrypted files
  • Share files via link
  • Group encrypted files under one link, to share multiple files at once
  • Set expiry date for files that will be removed by the cleanup command
  • Cleanup command that can be run via cronjob to remove expired files


To install AzineEmailBundle with Composer just add the following to your composer.json file:

// composer.json
    require: {
        "azine/azine/js-crypto-store-bundle": "dev-master"

Then, you can install the new dependencies by running Composer’s update command from the directory where your composer.json file is located:

php composer.phar update

Now, Composer will automatically download all required files, and install them for you. All that is left to do is to update your AppKernel.php file, and register the new bundle. AzineEmailBundle has a dependency on KnpPaginatorBundle, so it`s also nessesary to add it to AppKernel.php file after installing.


// in AppKernel::registerBundles()
$bundles = array(
    // ...
    new Azine\JsCryptoStoreBundle\AzineJsCryptoStoreBundle(),
    // ...

Register the routes of the AzineEmailBundle:

# in app/config/routing.yml

# Default configuration for "AzineJsCryptoStoreBundle"

    # Service used to get the ownerId (e.g. the current user id) to associate uploaded files with the current user. All files with the same owner_id as provided by this service will be shown on the dashboard
    ownerProvider:        Azine\JsCryptoStoreBundle\Service\DefaultOwnerProvider

    # Encryption Ciper Algorythm. Default: aes
    encryptionCipher:     aes

    # Encryption Mode. Default: 'gcm' (Galois/Counter mode)
    encryptionMode:       gcm

    # Encryption Key Hash-Iterations. Default: 1000
    encryptionIterations: 1000

    # KS. Default: 256
    encryptionKs:         256

    # TS. Default: 128
    encryptionTs:         128

    # Default expiry time/date for documents. Format: input for DateTime(). Default: '14 days'
    defaultLifeTime:      '14 days'

    # Maximum file size in bytes for the encryption. Default: 50'000'000 = 50mb
    maxFileSize:          50000000


See for valid configuration options for the encryption.

Customize Owner Provider

To be able to share administration of uploaded files among users of a team or company, you can implement you custom logic to return an owner id.

E.g. by user role or by a group/team/company attribute you have stored on your users.

You just need to implement your version of \Azine\JsCryptoStoreBundle\Service\OwnerProviderInterface, publish it as service and set the reference to your implementation in the config.yml.

Build-Status etc.

Build Status Total Downloads Latest Stable Version Scrutinizer Quality Score Code Coverage