web-dev-qa-db-fra.com

Stocker les données utilisateur chiffrées dans la base de données

J'ai une application Web qui a le cas d'utilisation suivant:

  • L'utilisateur crée un compte avec nom d'utilisateur et mot de passe - le mot de passe haché est stocké dans la base de données.
  • L'utilisateur se connecte (persiste entre les sessions) - le jeton de connexion est stocké dans un cookie.
  • L'utilisateur entre et soumet des données texte - les données sont stockées dans la base de données, mais sont sensibles et ne doivent pas être exposées même si la base de données est compromise.
  • Seul l'utilisateur (connecté) et personne d'autre ne peut lire les données soumises.
  • Pour plus de commodité, l'utilisateur ne devrait pas avoir à saisir de phrase secrète pour crypter/décrypter les données.

Est-ce faisable? Comment les données doivent-elles être cryptées?

21
Code

Vous pouvez utiliser une fonction de dérivation de clé pour convertir le mot de passe de l'utilisateur en une clé de chiffrement. Ensuite, vous utiliseriez un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé pour générer une clé distincte qui crypterait les données de l'utilisateur. Vous utiliseriez ensuite la clé dérivée pour crypter la clé générée. Le texte chiffré résultant de la clé de chiffrement des données pourrait ensuite être stocké en toute sécurité dans la table utilisateur de votre base de données (appelez le champ "clé chiffrée" si vous le souhaitez). De cette façon, le mot de passe de l'utilisateur deviendra le moyen de décrypter la clé cryptée de l'utilisateur. La clé qui crypte réellement les données n'est décryptée que suffisamment longtemps pour décrypter les données qu'elle a cryptées. Vous devrez stocker cette clé dans la session afin d'éviter d'avoir à demander à l'utilisateur son mot de passe à chaque occurrence de déchiffrement.

Vous pouvez également stocker la clé de chiffrement de clé sur un service de gestion de clés tel que celui proposé par Amazon AWS. De cette façon, vous récupérez la clé d'Amazon sur TLS en utilisant uniquement une référence à la clé. Bien sûr, dans ce cas, vous devrez toujours stocker les informations d'authentification pour le KMS quelque part dans votre architecture, éventuellement dans un fichier de configuration hautement sécurisé récupéré à distance.

  1. Générateur de nombres aléatoires ⟶ Aide à créer la clé # 1.
    Cette clé crypte vos données. Il reste constant dans le temps. Vous devez générer cette clé lors de la première inscription de l'utilisateur. Utilisez un CSPRNG (générateur de nombres pseudo-aléatoires cryptographiquement sécurisé) pour garantir un caractère aléatoire et imprévisible suffisant.

  2. Mot de passe ⟶ Converti en clé # 2 avec PBKDF2.
    Cette clé, la clé n ° 2, est utilisée pour crypter la clé n ° 1. Vous voudrez conserver la clé n ° 2 dans la session de l'utilisateur. Stockez la forme cryptée de la clé n ° 1 dans la table utilisateur, dans un champ appelé (peut-être) "clé cryptée".

  3. Modification des mots de passe
    Chaque fois que l'utilisateur modifie son mot de passe, il vous suffit d'exécuter l'étape 2 à nouveau, plutôt que de crypter toutes vos données, encore une fois. Il vous suffit de convertir le nouveau mot de passe en une clé (clé n ° 2), de rechiffrer la clé n ° 1 et d'écraser l'ancienne valeur de la forme cryptée de la clé n ° 1.

  4. Chiffrement/déchiffrement des données
    Une fois l'utilisateur connecté, exécutez l'étape 2. Une fois le mot de passe converti en clé, déchiffrez simplement la clé n ° 1. Maintenant que vous avez décrypté la clé n ° 1, vous pouvez utiliser la clé n ° 1 pour crypter et décrypter vos données.

17
vrtjason

Je ne sais pas si cela peut être efficace en tant que commentaire, au lieu d'une réponse: heureux de changer pour le mieux.

Le seul but est de donner une représentation visuelle de réponse acceptée de @ vrtjason , car cela inclut un certain nombre de scénarios et implique l'utilisation de deux clés (de chiffrement). Voici:

scenarios and used keys

Pour être complet, les clés impliquées dans de tels protocoles jouent des rôles connus dans la littérature comme:

  • Clé d'utilisateur: DEK, clé de chiffrement des données
  • Mot de passe-clé: KEK, Key Encryption Key

HTH

12
superjos