I am new to CSFLE and trying to use it with a mongoose based project, but the resulting data is not being encrypted, but I am not sure why. Can anyone help here?
My code:
src/index.ts
import mongoose from 'mongoose';
import crypto from 'crypto';
import { ClientEncryption } from 'mongodb';
import { createModel } from './models/Person';
const dbUri = 'mongodb://127.0.0.1:27017/mytestdb';
let masterKey = '';
function initEncrytion (masterKey: Buffer | string) {
const keyVaultNamespace = 'client.encryption';
const kmsProviders = { local: { key: masterKey } };
return {
keyVaultNamespace,
kmsProviders
};
}
async function initDatabase () {
const connection = await mongoose.connect(dbUri, {
autoEncryption: initEncrytion(masterKey)
});
return connection;
}
function generateLocalMasterKey () {
return crypto.randomBytes(96);
}
async function generateEncryptionKey () {
const connection = await mongoose.connect(dbUri, {});
const client = connection.connection.getClient();
const localMasterKey = generateLocalMasterKey().toString('base64');
const { keyVaultNamespace, kmsProviders } = initEncrytion(localMasterKey);
const encryption = new ClientEncryption(client, { keyVaultNamespace, kmsProviders });
const dekId = await encryption.createDataKey('local');
console.log('Master Key', localMasterKey.length);
console.log('Data Encryption Key ID:', dekId.toString('base64'));
return {
dekId, localMasterKey
}
}
async function main () {
// For now just lazily create a key every launch, since we are just testing things
const { dekId, localMasterKey } = await generateEncryptionKey();
masterKey = localMasterKey;
const connection = await initDatabase ();
const Person = createModel(dekId, connection);
await Person.create({
firstName: 'Bobby',
lastName: 'Drop Tables',
notes: 'Hello World'
})
process.exit(0);
}
main().catch(error => console.error(error));
src/models/Person.ts
import mongoose, { Mongoose, Document } from 'mongoose';
import IPerson from '../interfaces/IPerson.js';
import { UUID } from 'mongodb';
interface IPersonDB extends IPerson, Document { }
function createModel (keyId: UUID, connection: Mongoose) {
console.log('>> keyId:', keyId);
const PersonSchema = new mongoose.Schema(
{
resourceId: {
type: String
},
preferredName: {
type: String
},
firstName: {
type: String
},
initial: {
type: String
},
lastName: {
type: String
},
notes: {
type: String,
encrypt: {
keyId: keyId
}
}
},
{
timestamps: true,
encryptionType: 'queryableEncryption'
}
);
return connection.model<IPersonDB>('Person', PersonSchema);
}
export { createModel };