The Significance of Encryption in Database Security
Tags: tde, postgres, postgressql, database
Published: 2023-06-30 20:59:35


Data security is of paramount importance in today's digital landscape. With the increasing threat of data breaches and unauthorized access, organizations must take proactive measures to protect sensitive information. Encryption plays a crucial role in safeguarding data, particularly within databases. In this article, we will explore the significance of encryption in database security and delve into practical examples using PostgreSQL.

## Why is Encryption Important?

When it comes to data security, encryption is an indispensable tool. It ensures that even if an unauthorized individual gains access to the data, they cannot decipher it without the encryption key. Encryption transforms the data into an unreadable format, making it useless to anyone without the proper authorization. The benefits of encryption in database security are manifold:

1. **Confidentiality**: Encryption ensures that sensitive information remains confidential, helping mitigate the risk of unauthorized access and protect against data breaches.

2. **Compliance:** Many industries have strict regulations regarding the protection of sensitive data, such as personally identifiable information (PII), medical and financial records.  Utilizing encryption allows organizations to achieve compliance with relevant regulations and consequently, avoid legal repercussions.

3. **Data Integrity**: Encryption not only protects against unauthorized access but also helps maintain data integrity. By implementing encryption mechanisms, organizations can detect any unauthorized modifications or tampering of data. (This may not be the case for all database encryption mechanisms used, since size constraints may not leave room for anti-tampering checks)

4. **Trust and Reputation:** In an era where data breaches are increasingly common, customers and stakeholders value organizations that prioritize data security. By implementing encryption, organizations can build trust and keep client or customer data safe, which further maintains a solid reputation.

Now, let's explore practical examples of encryption in database security using PostgreSQL, one of the most popular open-source relational database management systems.

## Transparent Data Encryption (TDE) in PostgreSQL

Transparent Data Encryption (TDE) is a method of encrypting data at the storage level, ensuring that data remains encrypted when stored on disk. 

To demonstrate TDE in PostgreSQL, let's consider a scenario where we have a table called `customer` with sensitive information, such as email addresses and credit card numbers. We want to encrypt this data to ensure its security.

```sql
-- Enable TDE extension
CREATE EXTENSION pgcrypto;

-- Create a table for customers
CREATE TABLE customer (
    id SERIAL PRIMARY KEY,
    name TEXT,
    email TEXT,
    credit_card_number TEXT
);

-- Encrypt the sensitive columns
ALTER TABLE customer
    ALTER COLUMN email SET ENCRYPTED USING 'pgp_sym_encrypt',
    ALTER COLUMN credit_card_number SET ENCRYPTED USING 'pgp_sym_encrypt';
```

In the above example, we enable the `pgcrypto` extension, which provides cryptographic functions in PostgreSQL. We then create a table called `customer` and alter the sensitive columns (`email` and `credit_card_number`) to be encrypted using the `pgp_sym_encrypt` function provided by the `pgcrypto` extension. This ensures that the data in these columns is stored in an encrypted format when you execute a statement such as the following:

```sql
-- Insert sample data into the customer table
INSERT INTO customer (name, email, credit_card_number)
VALUES ('John Doe', 'jdoe@notrealdomain.com', '4111111111111111');
```

To retrieve the results in their plaintext format you can use the following statement

```sql
-- Select statement to query the customer table
SELECT id, name, pgp_sym_decrypt(email::bytea, 'encryption_key') AS email,
       pgp_sym_decrypt(credit_card_number::bytea, 'encryption_key') AS credit_card_number
FROM customer;
```

By implementing TDE in PostgreSQL, organizations can protect sensitive data stored on disk, mitigating the risk of data exposure in case of unauthorized access to the physical storage.

## Column-Level Encryption in PostgreSQL

In addition to TDE, PostgreSQL also supports column-level encryption. This allows organizations to selectively encrypt specific columns within a table, providing an additional layer of security for sensitive data.

Let's consider a scenario where we have a table called `employee` that contains personal information, including social security numbers. We want to encrypt the `social_security_number` column to ensure its confidentiality.

```sql
-- Enable TDE extension
CREATE EXTENSION pgcrypto;

-- Create a table for employees
CREATE TABLE employee (
    id SERIAL PRIMARY KEY,
    name TEXT,
    social_security_number TEXT
);

-- Encrypt the social_security_number column
ALTER TABLE employee
    ALTER COLUMN social_security_number SET ENCRYPTED USING 'pgp_sym_encrypt';
```

In this example, we enable the `pgcrypto` extension, create a table called `employee`, and alter the `social_security_number` column to be encrypted using the `pgp_sym_encrypt` function provided by the `pgcrypto` extension.

By encrypting sensitive columns at the column level, organizations can implement a fine-grained approach to data security, ensuring that only authorized users can access the decrypted data.

## Hashing for Password Storage

In addition to encryption, hashing plays a critical role in database security, particularly when it comes to storing passwords. Hashing is a one-way cryptographic function that transforms data into a fixed-length string of characters, known as a hash value. When a user enters their password, the system hashes it and compares it with the stored hash value for authentication.

Let's consider an example of storing passwords securely in PostgreSQL using hashing and salting.

```sql
-- Enable pgcrypto extension
CREATE EXTENSION pgcrypto;

-- Create a table for users
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT,
    password_hash TEXT,
    salt TEXT
);

-- Insert a user with a hashed password and salt
INSERT INTO users (username, password_hash, salt)
VALUES ('john_doe', crypt('P@ssW0rd123', gen_salt('bf')));
```

In this example, we enable the `pgcrypto` extension and create a table called `users`. The `password_hash` column stores the hashed password, and the `salt` column stores a random salt value generated using the `gen_salt` function. This is important because, ideally, we need to have unique salts so that if a compromise occurs in some way, the compromise remains only to that specific entry and not the entire table. 

*Note: This is just an example. Hashing algorithms used and how to apply and store salt (or pepper and no, it's actually a thing) is a separate topics for a later time*

When inserting a user, we use the `crypt` function to hash the password with the generated salt.

By employing hashing with salts, organizations can enhance the security of stored passwords. Even if an attacker gains access to the database, they cannot reverse-engineer the passwords from the stored hash values.

## Conclusion

In an increasingly interconnected world, securing data within databases is crucial for organizations. Encryption serves as a fundamental tool for protecting sensitive information from unauthorized access. 

By implementing encryption strategies, organizations can mitigate the risks associated with data breaches, comply with regulatory requirements, and build a solid foundation of trust with their customers and stakeholders.

**Remember:** encryption alone does not guarantee complete security. It should be part of a comprehensive security strategy that encompasses other measures such as access controls, secure key management, and regular security audits. By adopting a proactive approach to database security, organizations can protect their valuable data assets and maintain a robust security posture in the face of evolving threats.



## References

https://dba.stackexchange.com/questions/197167/do-i-need-to-execute-create-extension-pgcrypto-everytime

https://stackoverflow.com/questions/26656910/pgp-sym-encrypt-and-decrypt-an-entire-column-in-postgresql

https://www.postgresql.org/docs/current/pgcrypto.html

https://security.stackexchange.com/questions/17421/how-to-store-salt