Client-side Field Level Encryption in MongoDB using Python and FastAPI

Sumanta Mukhopadhyay
3 min readFeb 7, 2023

--

Data security is an increasingly critical concern for businesses and individuals alike. In an era where data breaches and cyber attacks are becoming more frequent and sophisticated, it is essential to protect sensitive information stored in databases. One of the most effective ways of achieving this is by using field-level encryption.

MongoDB, the popular NoSQL database, provides an excellent security feature called client-side field level encryption that allows you to encrypt sensitive data at the field level before storing it in the database. This means that the data is encrypted on the client side using an encryption library, such as PyMongo or MongoEngine, before being sent to the server.

In this article, we will demonstrate how to implement client-side field level encryption in MongoDB using Python and FastAPI. This combination of technologies provides a robust and secure platform for storing sensitive data in a database.

Setting up the environment

The first step is to set up your development environment. You will need to have the following installed:

  • Python 3.x
  • FastAPI
  • PyMongo
  • cryptography

To install FastAPI, use the following command:

pip install fastapi

To install PyMongo, use the following command:

pip install pymongo

To install cryptography, use the following command:

pip install cryptography

Generating the encryption key

We will be using the cryptography library to encrypt and decrypt our data. To start, we will generate an encryption key that we will use to encrypt and decrypt our data.

from cryptography.fernet import Fernet

# Generate encryption key
key = Fernet.generate_key()
cipher_suite = Fernet(key)

Writing the encryption and decryption functions

Next, we will write the encryption and decryption functions. The encryption function will take the plaintext data as input and return the encrypted data. The decryption function will take the encrypted data as input and return the decrypted data.

# Custom encryption function
def encrypt(plaintext):
return cipher_suite.encrypt(plaintext.encode())

# Custom decryption function
def decrypt(ciphertext):
return cipher_suite.decrypt(ciphertext).decode()

Setting up the database

We will use MongoDB as our database to store the encrypted data. To connect to the database, we will use PyMongo.

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["testdb"]

Building the FastAPI application

We will use FastAPI to build the application that will handle the encryption, storage, and retrieval of the data.

import fastapi

app = FastAPI()

@app.post("/store")
async def store_data(data: str):
encrypted_data = encrypt(data)
db.test_collection.insert_one({"data": encrypted_data})
return {"message": "Data stored successfully"}

@app.get("/retrieve/{data_id}")
async def retrieve_data(data_id: str):
data = db.test_collection.find_one({"_id": data_id})
decrypted_data = decrypt(data["data"])
return {"data": decrypted_data}

In the above code, the store_data function accepts a string of data as input and stores it in the database as an encrypted value. The retrieve_data function accepts a data id as input and retrieves the encrypted data from the database, decrypts it, and returns the decrypted data.

Conclusion

In this article, we demonstrated how to implement client-side field level encryption in MongoDB using Python and FastAPI. This combination of technologies provides a robust and secure platform for storing sensitive data in a database. We hope this article has been helpful in demonstrating the steps involved in implementing client-side field level encryption in MongoDB.

--

--

Sumanta Mukhopadhyay
Sumanta Mukhopadhyay

No responses yet