Data Encryption
This page describes what types of encryption should be used by the system hosting this module and what is implemented in this module.
Encryption in transit and at rest
Encryption in transit
It is site-level responsibility to setup encryption in transit, like SSL/TLS for all communication between clients and the server. For some hints on how this should be setup, start with the Django docs. We minimize the amount of potential data that is processed on the server, by doing most of the filtering client-side. Do take into account that ideally the connection from system to the database is secured as well, and that the database is stored on an encrypted system.
Encryption at rest
The module stores all data in encrypted fields in the database, the encryption/decryption procedure is described below.
Each project has a unique salt that is generated when creating the project.
In the Django site settings, we use the SECRET_KEY as the default passphrase for encryption.
If a project is working with sensitive data, we recommend that a project specific password is set.
This password is only known by the person setting it and should not be shared.
A project specific password will limit the functionality of the module for a given project: it won’t be possible to
create follow-up questions based on the data donation.
Encryption and decryption process
Steps
We use a hybrid asymmetric/symmetric encryption approach, due to the size limitation of the pure asymmetric approach. The encryption process consists of the following steps: - generate a public key and store it in the project (if none exists) - generate a session key used for encrypting a single message - encrypt the data symmetrically using the session key - encrypt the session key using the public key asymmetrically - store the encrypted data with the encrypted key as header
The decryption process consists of the following steps: - generate a private key - get the desired encrypted data from the project - decrypt the encrypted session key (header) asymmetrically using the private key - decrypt the data using the decrypted session key symmetrically
Asymmetric Key Generation and process
For encryption we only need the public key; - Check if we have a public key that is saved for the project - if not, we should have gotten a passphrase and a salt with which we can generate a public key. — generate the private key — derive the public key — save the public key for the project - We then use PKCS#1 OAEP for the wrapping and OAEP padding.
For decryption we need the private key; - Using the supplied passphrase and salt, we generate a 128bit HMAC digest, which we use to populate a pseudo-random number generator. - This random number generator is used to generate our RSA key. - We then use PKCS#1 OAEP for wrapping the OAEP padding.
Symmetric Key Generation and process
There are significant limitations on the size of the data that can be encrypted using asymmetric algorithms and severe performance penalties. This is why we combine this with symmetric encryption. In our case we use AES to encrypt the actual data.