README
Introduction
Encrypt your data when storing & decrypt when fetching in IndexedDB
It is a jsstore plugin which register a middleware. The middleware encrypt or decrypt values based on query.
Install
npm i jsstore-encrypt
Examples
https://github.com/ujjwalguptaofficial/jsstore-encrypt/tree/main/examples/
How to use
Setup
1. Create your encrypt decrypt method
importScripts("https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js")
var secret = "secret";
var JsStoreEncrypt = {
encrypt(message) {
return CryptoJS.AES.encrypt(message, secret).toString();
},
decrypt(message) {
var decryptedBytes = CryptoJS.AES.decrypt(message, secret);
return decryptedBytes.toString(CryptoJS.enc.Utf8);
}
}
save this code in a javascript file. Let's say we have saved inside file name - jsstore-encrypt.js
Important points -
- Above code uses cryptojs AES algorithm. But you can use any library or algorithm.
- If your code is asychronous, you can return promise.
2. Register plugin
import { encryptPlugin } from "jsstore-encrypt";
var connection = new JsStore.Connection();
connection.addPlugin(encryptPlugin, "path to jsstore_encrypt.js");
3. Create db schema & mark columns to encrypt
const tblStudent = {
name: 'Students',
columns: {
id: {
primaryKey: true,
autoIncrement: true
},
name: {
notNull: true,
dataType: DATA_TYPE.String
},
secret: {
dataType: DATA_TYPE.String,
encrypt: true
} as any
}
};
const dataBase: IDataBase = {
name: dbname,
tables: [tblStudent]
};
In the above schema, column secret is marked to be encrypted. So only column secret will be encrypted when inserted or updated & decrypted when selecting.
Insert data
connection.insert({
into: "Students",
values: [{
city: "bangalore",
country: "india",
gender: "male",
name: "ujjwal",
secret: "i want to travel the world"
}],
encrypt:true
})
The encrypt option tells jsstore-encrypt to encrypt the values. Only column marked with ecnrypt in the database schema will be encrypted - in our case secret.
Select data
connection.select({
from: "Students",
decrypt: true,
})
The decrypt option tells jsstore-decrypt to decrypt the values. Only column marked with ecnrypt will be decrypted - in our case secret column only.
Update data
connection.update({
in: "Students",
encrypt: true,
set:{
name:'Ujjwal Gupta',
secret:"Being more human"
}
})
In case of update, set values are encrypted.
Where (Filter)
In order to work where - the encrypt algorithm should generate the same value always, so that we can encrypt a value and search in stored values.
connection.select({
from: "Students",
decrypt: {
where:{
secret:"Being more human"
}
}
})
When you add where inside decrypt/encrypt, all values inside where are encrypted.
👉 You can also use your normal field without encrypt option similar to how you were using before -
connection.select({
from: "Students",
decrypt: {
where:{
secret:"Being more human"
}
},
where:{
id:1
}
})
Note:- Partial where option - regex, like etc doesn't work in case of encryption as the values are stored as different data.