Encryption is a time-tested tool that can severely hinder attackers in their goal to steal confidential user and customer data, trade secrets, and more. However, many – if not most – organizations do not encrypt their data. (Just one very recent example is TalkTalk.)
Historically, encryption has mainly been deployed to protect data in transit, and many organizations are slow in shifting to also using it to protect data at rest. This is most likely due to the fact that organizations feel that their internal private network is safe. This is a real concern today since the massive theft of data we have seen over the past few years has actually been from data at rest.
When an organization wishes to deploy encryption, it typically faces two main challenges: how to encrypt, and how to protect the secret keys. It is an unfortunate fact that non-experts very often use encryption incorrectly. Unlike most other software engineering tasks, a badly deployed encryption method cannot be detected by quality assurance. Thus, a software engineer really has no way of testing what has been implemented.
To make things worse, the Internet is full of code examples and articles about how to encrypt that are misleading and incorrect. There is no real way to fix this other than becoming a cryptographer oneself, and this is an unrealistic solution, especially since, as we have mentioned, studying from the Internet is not necessarily reliable enough.
Nevertheless, the following five tips, based on current up-to-date best practices, can help:
Encryption TIP 1: Always use standard algorithms and never make up your own. As a rule of thumb, use AES (Advanced Encryption Standard) for symmetric encryption and RSA for asymmetric encryption.
Encryption TIP 2: Always use key sizes as mandated by standards bodies like NIST. As a rule of thumb, use AES-128 and RSA-2048 at least.
Encryption TIP 3: By default, use authenticated encryption modes of operation for AES (AES-GCM or AES-CCM) and use PCKS#11 v2.1 padding for RSA. When hash functions are needed (e.g., for signing), use SHA256 by default.
Encryption TIP 4: Make sure that your code is agile so that algorithms, key sizes, and modes of encryption can be easily replaced. The reality of encryption is that you will have to update your code over the years.
Encryption Tip 5: Given the difficulty of getting all of the above right, my best recommendation is to use a high-level API to encrypt (e.g., the EVP library in OpenSSL), or buy a solution.
Where do you store the secret keys?
In the example of application-layer database encryption, you could keep the key on the database with the encrypted data -- and this is often what is done. However, this means that an attacker will be able to steal the keys along with the encrypted data, and decrypt everything later. So, not much is actually gained by encrypting to start with.
Another option is to store the keys on the application server. However, this involves key synchronization issues; multiple application servers access the same database and so all need to have the same keys. More importantly, application servers are often among the most vulnerable places in your network. Since the application servers have permissions to read the database, an attacker breaching an application server can steal the keys and run a SELECT * to read the entire database. Once again, everything can then be decrypted later.
Attempts to hide the key via obfuscation and using multiple layers of protection on the application server are good ideas, but typically not sufficient against today’s sophisticated attackers.
The best option is therefore to allocate a dedicated hardened server that holds all secret keys and carries out all the operations for the application servers without ever handing over the keys. When configured correctly, this can be a good solution. However, you have to make sure that you deal with availability issues, and that only authorized application servers have access. It’s also critical that the dedicated server be very well-protected. This makes deploying such a solution rather challenging -- but still possible. Alternatively, as above, there are key protection solutions offered on the market that can be used.
In summary, encryption is now an absolute must, and the fact that it is difficult does not change the fact that you have to use it. The cost of a breach is too great and the chance of it occurring too high to ignore the problem. As a result, you must either develop sufficient in-house expertise, pay expert consultants to provide clear instructions for your developers, or buy off-the-shelf solutions. All of these options are possible, and choosing the right one depends on the needs of your organization and the investment that you wish to make.