2010-06-14 5 views
3

Mon application Web stocke les noms d'utilisateur/mots de passe de sites Web externes pour interagir avec eux. Pour interagir avec ces sites Web, je dois utiliser le texte du mot de passe d'origine, donc stocker le hachage dans ma base de données ne va pas fonctionner.Enregistrement du texte du mot de passe original

Comment conserver ces mots de passe?

Éditer: Je suis inquiet si quelqu'un a accès à mon serveur. Si j'utilise un cryptage bidirectionnel et qu'ils ont un accès au serveur, ils peuvent simplement vérifier comment les mots de passe sont décryptés dans mon code backend.

Répondre

3

Il me semble que vous voulez stocker les mots de passe de la même manière que Firefox et Chrome. Alors pourquoi ne pas regarder comment ils le font?

Voici comment Chrome il fait: http://www.switchonthecode.com/tutorials/how-google-chrome-stores-passwords

+0

La partie intéressante est à la toute fin: "CryptProtectData, qui est une fonction Windows API pour le cryptage des données. [...] Elle ne peut être décryptée que sur la même machine et par le même utilisateur ..." Dites-nous comment le chiffrement fonctionne, ou quelles sont les alternatives pour d'autres plates-formes, donc je ne suis pas sûr que ce soit directement applicable. –

3

Si vous DEVEZ le faire, vous devez utiliser un cryptage bidirectionnel. Il y a beaucoup d'algorithmes (chiffrements) pour cela, mais fondamentalement, vous cryptez vos données avec une clé de chiffrement, et utilisez la même clé pour les décrypter à nouveau.

Le choix du chiffre droit dépend qui sont pris en charge par le langage de programmation de votre choix, mais voici quelques exemples:

  • Blowfish
  • 3DES
  • listao

Ils viennent dans différentes la complexité et certains sont plus difficiles à casser que d'autres. Vous devriez comprendre, cependant, qu'aucun cryptage bidirectionnel n'est à l'abri de la fissuration, si vous disposez de suffisamment de temps. Tout dépend donc de la sensibilité de ces mots de passe.

/Carsten

+0

OK, mais où stockez-vous la clé de cryptage? Il me semble que vous venez de déplacer le problème à un endroit différent. –

+0

c'est ce qui m'inquiète - si quelqu'un a accès à mon serveur, il peut alors travailler sur les mots de passe originaux, qu'ils soient cryptés ou non. – hoju

+0

@Mike: D'accord. Mais en fonction de la configuration de Richard, les données de la base de données peuvent être "plus faciles" à accéder (du point de vue d'un pirate) que le système de fichiers. Donc, toutes nos réponses dépendent du type de menace que Richard veut éliminer. –

3

Décidez de ce que vous les protégez. Les options incluent (mais ne sont pas limitées à): divulgation accidentelle, divulgation par vous, divulgation en transmission, divulgation en raison d'une erreur de code, divulgation en raison du vol physique du matériel, etc.

S'il s'agit d'une application Web, et chaque l'utilisateur stocke son propre ensemble de mots de passe, puis vous pouvez crypter ces mots de passe avec leur mot de passe de connexion à votre application. S'il s'agit d'une application que chaque utilisateur installe séparément et qui conserve sa propre base de données locale, vous pouvez avoir un mot de passe maître optionnel (comme le fait Firefox). Si vous vous assurez seulement que les données sont sûres si le matériel est volé, vous pouvez utiliser une solution de chiffrement de disque complet comme TrueCrypt ou PGP WDE, ou l'approche intégrée de Debun, Debian ou Fedora, et exiger un code PIN ou un mot de passe à chaque démarrage. Si vous vous souciez uniquement de la transmission sécurisée, ayez du code pour vous assurer que vous utilisez la sécurité du transport et ne vous souciez pas du cryptage des données dans votre base de données.

+0

ouais c'est une application web et je suis préoccupé par quelqu'un qui accède au serveur où la base de données et le code backend est lisible – hoju

+0

Donc crypter (symétrique) les mots de passe dans la base de données avec le mot de passe de l'utilisateur ou une dérivée comme clé (par exemple secure_hash (constant_server_secret + user_password)) Vous gardez cette clé en mémoire seulement tant que sa session est active, en la rejetant lorsque sa session expire ou en se déconnectant. Ne l'envoyez pas à l'utilisateur; ils s'en foutent et il expose la clé. Les seuls mots de passe auxquels un attaquant (ou même vous-même) a accès sont ceux des utilisateurs avec des sessions actives, et seulement avec un nettoyage soigneux de l'état actuel de la mémoire. – Slartibartfast

3

Je voudrais aller à ce sujet de la manière suivante.

données Protection contre les matériels volés:

Utiliser le chiffrement du disque comme indiqué dans les messages précédents.

données Protection si le serveur est compromise (piraté):

J'utiliser deux serveurs différents pour ce projet, un serveur de travail et un serveur avant.

A) serveur travailleur

  • Cela a DB avec des mots de passe etc, il se connecte également à d'autres services.
  • Pour se connecter au serveur de travail, les utilisateurs peuvent le faire via une API. API devrait avoir sur la fonction, insertUserData, qui permet à l'utilisateur d'insérer des données, API échappé à toutes les entrées.
  • L'API utilise un utilisateur de base de données qui n'a que les droits d'entrée sur la table userData. Ce serait le seul moyen de contacter ce serveur.
  • Autoriser uniquement les connexions SSL .
  • Ce serveur exécute à son tour des travaux chroniques qui se connectent à des services externes, en extraient des données et remplissent sa base de données. Utilisez une base de données différente avec différents privilèges d'utilisateur.
  • Ce serveur exécute une autre tâche chronologique qui se connecte au serveur frontal et envoie de nouvelles données au serveur frontal.
  • Quantité minimale de services en cours d'exécution
  • Seul SSH/SCP de votre adresse IP, le pare-feu étanche. Bloquer si les connexions excédaient X/min etc. car elles ne feraient qu'une insertion occasionnelle.
  • NO FTP, etc.

B) Serveur avant

reçoit les données du serveur travailleur, utilise jamais les mots de passe lui-même. Le seul moyen de contacter le serveur de travail est l'API mentionnée ci-dessus, uniquement pour les nouvelles informations utilisateur. Le problème avec tout faire sur le même serveur, si vous êtes piraté le pirate peut s'asseoir et renifler toutes les données entrantes/mots de passe etc. .. même si elles sont stocké/chiffré/décrypté en toute sécurité, avec un peu de patience il les reniflerait tous. Lorsque l'application est lancée pour la première fois, elle génère une clé aléatoire.

+0

Je me rends compte que si un hacker a accès au serveur de travail, vous êtes foutu mais cela le rendrait presque impossible. Vous pouvez également ajouter que l'API sur le serveur de travail appelle une procédure stockée à son tour. – grandnasty

1

Cette clé sera utilisée pour crypter et décrypter les données sensibles. Stockez la clé dans un fichier local et définissez les autorisations de fichier afin que personne d'autre ne puisse le lire. Assurez-vous que l'utilisateur qui exécute le serveur Web n'a pas accès à la connexion (c'est une bonne idée de toute façon).

moyens possibles pour briser ce système:

  1. Obtenir un accès root.
  2. Obtenir l'accès sudo.
  3. Déployez une application malveillante sur le serveur Web - cette application aura alors accès à la clé et pourra l'envoyer ailleurs.

Tant que vous prenez des précautions raisonnables contre tout cela, vous devriez être OK.


EDIT: Venez y penser, vous pouvez simplement stocker les données sensibles dans le droit fichier clé. Le cryptage fournirait une couche supplémentaire de sécurité, mais ce ne serait pas une couche très forte; Si un attaquant accède au fichier, il a de bonnes chances qu'il ait également accès à la base de données.

Questions connexes