Question

Je dois stocker les mots de passe de la base de données dans un fichier de configuration. Pour des raisons évidentes, je souhaite les chiffrer (de préférence avec AES). Est-ce que quelqu'un connaît une implémentation Delphi facile à introduire dans un projet existant avec > 10 000 lignes de code source historiquement développé (URGH!)?

Clarification: Facile signifie ajouter l’unité au projet, ajouter max. 5 lignes de code où le fichier de configuration est lu et être fait avec. Ne devrait pas prendre plus de 15 minutes.

Autre précision: le mot de passe est nécessaire pour créer une connexion à la base de données, et non pour prendre en charge un schéma de gestion des utilisateurs pour l'application. Donc, utiliser des hachages n'aide pas. Le moteur de base de données vérifie si le mot de passe est valide et non l'application.

Était-ce utile?

La solution

J'appuie la recommandation concernant la bibliothèque DCPCrypt de David Barton. Je l'ai utilisé avec succès dans plusieurs projets et cela ne prendra pas plus de 15 minutes après la lecture des exemples d'utilisation. Il utilise la licence MIT, vous pouvez donc l'utiliser librement dans des projets commerciaux et autres. DCPCrypt implémente un certain nombre d'algorithmes, y compris Rijndael, qui est AES.

Il existe également de nombreuses implémentations autonomes (unités uniques). La question est de savoir laquelle vous avez confiance, à moins que vous ne soyez prêt à vérifier vous-même la correction d'une bibliothèque particulière.

Autres conseils

Pour les besoins de l'authentification standard, vous n'avez pas besoin de stocker les mots de passe, il vous suffit de vérifier si le mot de passe saisi par l'utilisateur est correct. Si tel est votre cas, vous pouvez simplement stocker une signature de hachage (par exemple, MD5) et la comparer à la signature du mot de passe saisi. Si les deux signatures correspondent, le mot de passe saisi est correct.

Stocker des mots de passe cryptés peut être dangereux, car si quelqu'un obtient votre "maître". mot de passe, ils peuvent récupérer les mots de passe de tous vos utilisateurs.

Si vous décidez d'utiliser MD5, vous pouvez utiliser MessageDigest_5.pas fourni avec Delphi (au moins, il est inclus dans ma copie de Delphi 2007). Vous pouvez également choisir d’autres implémentations avec le code source Delphi.

Je pense que Turbopower LockBox est une excellente bibliothèque pour la cryptographie:

http://sourceforge.net/projects/tplockbox/

Je ne sais pas si c'est trop gros pour vos utilisations, mais c'est très facile à utiliser et vous pouvez chiffrer une chaîne avec 5 lignes de code. Tout est dans les exemples.

TOndrej a la bonne approche. Vous ne devez jamais stocker un mot de passe à l'aide d'un chiffrement réversible. Comme il a été correctement indiqué, si votre "maître" clé ont jamais été compromises, tout le système est compromis. L'utilisation d'un hachage non réversible, tel que MD5, est beaucoup plus sécurisée et vous pouvez stocker la valeur hachée en texte clair. Il suffit de hacher le mot de passe saisi, puis de le comparer avec le hachage stocké.

J'ai toujours utilisé Turbopower Lockbox. Cela fonctionne bien et très facile à utiliser. En fait, je l'utilise exactement pour la même chose, en stockant un mot de passe dans un fichier texte de configuration.

http://sourceforge.net/projects/tplockbox/

TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) utilise le salage automatique. Je recommande contre DCPCrypt Barton parce que les IV ne sont pas salés. Dans certaines situations, il s’agit d’un grave problème de sécurité.

Contrairement à un message précédent, la mise en oeuvre de AES par LB3 est entièrement conforme à la norme.

J'ai utilisé cette bibliothèque , très rapide à ajouter. Mais le wiki montre quelques solutions supplémentaires.

Même si vous cryptez, il me semble que votre clé de décryptage ainsi que le mot de passe crypté seront tous deux dans votre exécutable, ce qui signifie que ce n’est en aucun cas une sécurité par obscurité. Tout le monde peut récupérer la clé de déchiffrement et les mots de passe chiffrés et générer les mots de passe bruts.

Ce que vous voulez, c'est un hash à sens unique.

Juste un rappel.

Si vous n'avez pas besoin d'interagir avec d'autres bibliothèques cryptées, alors DCP ou LockBox fera l'affaire.

MAIS

si vous en avez besoin pour vous conformer entièrement aux spécifications de rinjdael, oubliez les composants libres, ils sont un peu "moche" la plupart du temps.

Comme d'autres l'ont fait remarquer, pour des raisons d'authentification, évitez de stocker les mots de passe à l'aide d'un cryptage réversible, c'est-à-dire, stockez uniquement le hachage du mot de passe et vérifiez le hachage du mot de passe fourni par l'utilisateur par rapport au hachage que vous avez stocké. Cependant, cette approche a un inconvénient: elle est vulnérable aux attaques de la table arc-en-ciel , si un attaquant s'empare de de votre base de données de magasin de mots de passe.

Ce que vous devez faire est de stocker les hachages d’une valeur sel pré-choisie (et secrète) + le mot de passe. C'est-à-dire concaténer le sel et le mot de passe, hacher le résultat et stocker ce hachage. Procédez de même lors de l'authentification: concaténez votre valeur de sel et le mot de passe fourni par l'utilisateur, hash, puis vérifiez son égalité. Cela rend les attaques de table arc-en-ciel irréalisables.

Bien sûr, si l'utilisateur envoie des mots de passe sur le réseau (par exemple, si vous travaillez sur une application Web ou client-serveur), vous ne devriez pas envoyer le mot de passe en texte clair, par conséquent, au lieu de stocker le hachage (sel + mot de passe) vous devez stocker et vérifier contre le hachage (sel + hachage (mot de passe)) et demander à votre client de pré-hacher le mot de passe fourni par l'utilisateur et de l'envoyer sur le réseau. Cela protège également le mot de passe de votre utilisateur si celui-ci (comme beaucoup le font) réutilise le même mot de passe à des fins multiples.

Je recommande d'utiliser un type de sel. Ne stocke pas crypt (mot de passe) dans le fichier de configuration, mais instaure de cette banque crypt (sel + mot de passe). En tant que "sel", vous pouvez utiliser quelque chose qui est nécessaire pour ouvrir une base de données, par exemple. nom_base + nom_utilisateur. Pour la fonction cryptée, vous pouvez utiliser un algorithme bien connu comme AES, Idea, DES ou quelque chose d'aussi simple que de mémoriser chaque octet avec l'octet d'une autre chaîne. Cette chaîne sera votre clé. Pour le rendre plus différent à résoudre, vous pouvez utiliser des octets aléatoires et les stocker.

Donc pour stocker:

  1. init_str: = 5 octets aléatoires
  2. new_password: = salt + password // salt: = nom_bd + nom_utilisateur
  3. crypted_password = xor_bytes (init_str + new_password, 'my keyphrase')
  4. crypted_password: = init_str + crypted_password
  5. stocke crypted_password dans config, car ce seront des octets que vous pouvez hexifier ou base64

Et pour vous connecter:

  1. scinder les données lues dans config en init_str et crypted_password
  2. new_password = xor_bytes (init_str + crypted_password, 'my keyphrase')
  3. mot de passe: = remove (nom_db + nom_utilisateur) de new_password

Nick a bien sûr raison - je suppose que vous savez ce que vous faites lorsque vous dites que vous souhaitez consacrer toutes les 15 minutes à la mise en œuvre d’une solution de sécurité. La bibliothèque DCPCrypt implémente également un certain nombre d’algorithmes de hachage si vous décidez d’emprunter cette voie (meilleure).

Quelques solutions:

  • Ne stockez pas le mot de passe du tout. Si la base de données prend en charge intégré authentification, utilisez-le. Le processus peut être configuré pour fonctionner avec un spécifique identité, et être automatiquement authentifié par la base de données
  • Utiliser les magasins de certificats Windows et un certificat pour chiffrer votre mot de passe. Si vous stockez la clé utilisée pour chiffrer votre mot de passe dans votre application, vous avez quand même très peu de sécurité, vous devez également protéger la clé.

Vous devez le stocker dans un endroit où seul l'utilisateur actuel a également accès.

En principe, il existe deux façons de procéder:

  1. Stockez-le dans un fichier crypté EFS .
  2. Stockez-le dans le stockage local sécurisé .

Internet Explorer utilise 2. Mais si vous pouvez obtenir un accès local, vous pouvez décrypter les deux 1. et 2. si vous avez la bonne clé principale et le bon algorithme (par exemple, iepv peut obtenir les mots de passe d’Internet Explorer).

Donc:
Si vous le pouvez, évitez de stocker les mots de passe.
Recherchez d’abord des alternatives (telles que l’authentification Windows, les services de répertoire, etc.).

- jeroen

La démonstration de cette Embarcadero offre un système simple mais pour la plupart des applications: https://edn.embarcadero.com/article/28325

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top