web-dev-qa-db-fra.com

Chiffrement des données par application vs chiffrement des données dans la base de données

Pour une mise en œuvre du GDPR (EU General Data Protection Regulation), je dois crypter certaines informations personnelles. Il existe deux façons de crypter les données:

  • Laissez l'application Web avoir la seule responsabilité du chiffrement et du déchiffrement. Les données réelles dans la base de données sont entièrement cryptées. De cette façon, si les données sont volées, les données sont en sécurité (en supposant que mon cryptage est bon).

  • Activez le chiffrement au niveau de la base de données et ajoutez l'application Web d'accès en tant que client de confiance. Le chiffrement et le déchiffrement se produisent dans la base de données elle-même. De cette façon, si les informations d'identification de la base de données sont connues, les données sont perdues.

Alors, quelle est la meilleure façon sans trop compromettre les performances?

18
madhairsilence

Laisser votre base de données gérer le cryptage/décryptage est probablement pour le mieux:

  1. Vous n'avez pas besoin d'écrire de code de chiffrement/déchiffrement et risquez de briser votre propre sécurité par accident. Cela signifie également que, comme Guntram Blohmsouligné , vous n'aurez pas à prouver votre propre sécurité pour être sécurisé, si cela se résume à cela. Et prouver que votre logiciel personnalisé est sécurisé est aussi difficile que vous le pensez probablement, sinon plus.
  2. L'utilisation des éléments intégrés à votre base de données est généralement plus facile, par exemple Postgres vous permet de choisir les colonnes et les tables à crypter, et leur conception n'a que brièvement les clés et les données décryptées sur le serveur. D'autres bases de données sont probablement similaires, mais c'est la seule que je connaisse.
  3. Si vous devez, par exemple, générer un rapport sur la base des données, il sera plus simple de le faire avec un outil existant qui prend en charge les bases de données chiffrées que d'écrire vous-même tout le code personnalisé côté client.
  4. Si jamais vous avez besoin de filtrer les données qui ne sont pas sur des valeurs exactes et sensibles à la casse, la base de données se chargera de le faire efficacement pour vous, par exemple maintenir les indices mais les garder chiffrés jusqu'à ce qu'ils soient nécessaires, et même alors, ne déchiffrer que les valeurs spécifiques dont ils ont besoin à un moment donné.

Il y a un point en faveur du chiffrement côté client, que vous avez déjà mentionné. C'est un gros problème, mais je ne pense pas qu'il l'emporte sur les avantages ci-dessus:

  1. Votre sécurité sera légèrement augmentée si vous gérez tout le cryptage/décryptage côté client, car à aucun moment la base de données (et donc les administrateurs système malveillants/attaquants qui contrôlent ce serveur) ne connaissent la clé de décryptage ou les données décryptées. Cependant, selon les données et leur utilisation, il y a quelques inconvénients à considérer:
    • Il est tout à fait possible que vous gâchiez votre code de cryptage côté client et que vous fassiez fuir les données/clés de cette manière, soit directement soit via canaux latéraux .
    • Vous devez soit faire confiance an extérieur ou gérer vous-même la gestion des clés, ce qui n'est pas anodin (et est très pas trivial à supporter dans le code, si vous voulez éviter les temps d'arrêt planifiés de temps en temps)
    • Si vous gâchez votre code, vous seul (enfin, votre entreprise seule - vous savez ce que je veux dire) êtes responsable de le réparer et de nettoyer les dommages, et tout correctif est tout aussi susceptible d'avoir des bogues que votre code d'origine. Peut-être plus, étant donné que vous serez stressé.
    • Vous devrez soit dépenser beaucoup de temps pour régler les performances, soit accepter que vos performances seront mauvaises, soit réduire la sécurité pour des gains de performances faciles (par exemple en court-circuitant une comparaison ou en précalculant certaines constantes ou en laissant votre compilateur optimiser les mauvais bits). Rien de tout cela n'est une bonne chose à faire. Le serveur de base de données a déjà eu un lot de personnes faisant un lot de réglage; vous referiez tout cet effort à partir de zéro.
    • Pour chaque nouveau développeur, vous devrez soit les former aux bonnes pratiques de codage sécurisé, soit leur dire de ne pas toucher aux bits de sécurité de votre code, qui ne sont ni économiques ni même généralement aussi fiables.
    • Si vous devez implémenter un filtrage flou côté client, vous devrez essentiellement faire SELECT * FROM table; et décrypter et filtrer manuellement chaque ligne, ce qui ne va tout simplement pas bien se passer. Vous garderez la clé en mémoire sur un serveur directement accessible sur le Web pendant une longue période, en réponse directe à une demande qui peut être envoyée par un attaquant.

Comme Kevinsouligne , vous avez également la possibilité de crypter des champs spécifiques. Par exemple, si vous stockez le nom d'utilisateur et le numéro de carte de crédit d'un client, ce dernier définitivement doit être crypté, mais le premier ne le fait probablement pas. Vous pouvez inclure par exemple une contrainte CHECK pour vous assurer que vous n'ajoutez pas accidentellement une carte de crédit non chiffrée. Les numéros de carte de crédit en sont un bon exemple, car vous n'avez jamais besoin de faire de correspondance avec eux - vous ne les récupérez ou ne les stockez que dans la base de données, vous pouvez donc les gérer efficacement du côté client.

Cependant, notez que une bonne sécurité n'est pas une chose . Une bonne sécurité fait tout correctement:

  • Analyser votre modèle de menace pour vous assurer de vous prémunir contre les bonnes menaces
  • Utilisation de HTTPS pour l'ensemble de votre site Web avec des certificats valides et actuels
  • Crypter votre base de données, d'une manière ou d'une autre
  • Chiffrement de la communication entre votre site Web et votre base de données
  • Utiliser SQL correctement pour éviter l'injection SQL
  • Renforcer votre serveur de base de données pour le protéger des attaques
  • Appliquer le principe du moindre privilège
  • Et tellement plus .

Quelle que soit la façon dont vous gérez votre base de données, ce n'est pas la fin du chemin. Assurez-vous de prendre soin de tout .

28

L'ajout de cryptage sur sa base de données par champ ou par groupe de champs semble être le meilleur compromis à condition qu'un ou plusieurs champs d'index soient également créés avec chaque champ crypté.

Vous résoudriez plusieurs problèmes à la fois.

  1. La recherche d'index serait tout aussi rapide
  2. Tous les champs n'ont pas besoin d'être cryptés
  3. Les frais généraux de chiffrement sont réduits au minimum en mettant l'accent sur le RGPD.
  4. Des mots de passe différents pour chaque champ peuvent être utilisés pour différents utilisateurs finaux, car le privilège le permet
3
John Greene

La dernière tendance est de stocker les clés privées dans un HSM qui sont des modules de sécurité matériels. Il existe des options pour marquer la clé comme non exportable depuis le HSM. Le morceau de données qui doit être chiffré est envoyé au HSM, mais il peut être un problème de performance en cas de grande quantité de données. Si la clé est exportable, elle sera uniquement exportée et conservée en mémoire pour être utilisée par l'application pour le chiffrement. Lorsque la clé est exportée, elle doit d'abord être chiffrée à l'aide d'une autre clé publique dans le HSM, puis envoyée à l'application. Étant donné que l'application possède sa clé privée, elle peut déchiffrer notre clé de chiffrement principale. Maintenant, la question est de savoir où cette clé de clé doit être stockée? Il peut être stocké dans une base de données avec un accès limité.

0
securitygeek