Hur krypterar jag känslig data?
Mongoose-encryption är en plugin för Mongoose som kan användas för att kryptera vissa eller alla egenskaper i dokument innan de lagras i databasen och dekryptera dem när de hämtas.
Så här använder du mongoose-encryption för att kryptera enskilda egenskaper i ett dokument:
Installera mongoose-encryption-paketet via npm:
Importera bcrypt, mongoose-encryption, mongoose, validator och baseSchema:
Skapa en fras (sträng) att använda vid både kryptering och signering. OBS: Spara denna fras säkert, om den går förlorade blir all krypterad data oåtkomlig.
Skapa ett Mongoose-schema och lägg till pluginet mongoose-encryption till schemat. Ställ in
encryptedFields
-alternativet för att specificera vilka egenskaper som ska krypteras.excludeFromEncryption
är en lista över fältnamn som inte ska krypteras, men skyddas av HMAC-signering som förhindrar otillåten modifiering av data. Dessa fält är sökbara och kan indexeras av databasen, men deras integritet kan fortfarande skyddas.I det här exemplet kommer endast
email
-egenskapen att krypteras. (Självklart saltas och hashas lösenordet!)Skapa en Mongoose-modell med det krypterade schemat:
👉 VIKTIGT!
Om du i ett schema väjer att i samband med att ett dokument transformeras till ett objekt ta bort egenskaper som _id
kommer det resultera i ett fel då dokumentet dekrypteras. mongoose-encryption anropar .toObject() (och inte .toObject({ transform: false })
(bugg?)), vilket leder till att felet inträffar.
Konverteringsinställningen för transform
-funktionen behöver modifieras så att _id
inte tas bort i samband med att dokumentet sparas.
Sammanfattning
Nu kommer varje dokument som skapas med UserModel
-modellen att ha det krypterade fältet (email
) lagrat krypterat i databasen, och det kommer att dekrypteras automatiskt när det hämtas via Mongoose.
Det är viktigt att notera att krypteringen här är på dokumentnivå och inte databasnivå. Sökning eller sortering på krypterade egenskaper kommer inte att fungera direkt eftersom krypterade värden kommer att vara olika för varje dokument.