Hibernate authentification sans mot de passe stockés en clair
Mon objectif est de s'authentifier auprès de la base de données à l'aide de JDBC/Hibernate de manière sécurisée, sans stocker les mots de passe en texte clair. Les exemples de Code apprécié. Je suis déjà à l'aide de gaufre pour authentifier l'utilisateur, donc si il y avait moyen d'utiliser les informations d'identification que la gaufre obtenus à partir de l'utilisateur, et avant ceux de la DB, ce serait bien.
Deux questions:
- Quelle est la méthode recommandée pour multi-hop d'authentification (le client, le serveur web et la base de données sont toutes différentes machines) avec tomcat/hibernate/spring sur le serveur web, une base de données sql, et bien évidemment navigateur client?
- Je voudrais également vous contenter d'une manière d'utiliser un seul compte d'utilisateur pour faire de l'authentification, tant que l'utilisateur du compte de l'information n'a pas été stocké dans la plaine du texte n'importe où. Le compte d'utilisateur aurez besoin de privilèges de lecture/écriture sur la DB.
J'ai trouvé quelques informations utiles à propos de la connexion à SQL Server dans ce fil. Toutefois, je m'attends à ce que Tomcat s'exécuter sous le compte par défaut, qui est comme l', le Système Local ou quelque chose. Autant que je sache, ce compte ne peut pas être utilisé pour faire de l'authentification windows à la base de données.
Ma solution:
J'ai fini à l'aide de l'approche mentionné dans le fil au-dessus. Au lieu d'exécuter le service Tomcat en tant que Système Local, il est maintenant en cours d'exécution en tant qu'utilisateur. Cet utilisateur a l'autorisation d'accéder à la base de données. Mon fichier de configuration hibernate est configuré comme suit:
<property name="hibernate.connection.url">
jdbc:sqlserver://system:port;databaseName=myDb;integratedSecurity=true;
</property>
À ceux qui ont fourni des réponses
Je remercie à l'avance de l'aide et je vais essayer quelques techniques mentionnées dans le fil. Mon problème avec certaines des réponses est qu'elles nécessitent de chiffrement symétrique qui nécessite une clé secrète. En gardant le secret de la clé est presque exactement le même problème que pour stocker le mot de passe en texte clair.
Vous devez vous connecter pour publier un commentaire.
Bien, nous allons jeter un oeil à ce problème. Vous voulez avoir l'information d'authentification mis à disposition mais pas codé en dur n'importe où dans le code ou dans le système de fichiers. Ce que je suggère:
Cette solution exige une certaine extension de printemps contexte du chargement, de sorte qu'il attend jusqu'à ce que les informations d'authentification spécifié (via la page d'entrée).
j'ai récemment blogué sur ce:
vous pouvez dire tomcat jdbcrealm d'utiliser un algorithme de digest sur le mot de passe comme sha-256 et enregistrer la valeur de hachage plutôt que des mots de passe en clair.
Supposons que votre Utilisateur entités ressembler à ceci:
lors de la création d'un nouvel Utilisateur par l'intermédiaire d'un service, il est possible de créer un hachage de mot de passe à l'aide d'un MessageDigest:
depuis SHA-256 produisent toujours les mêmes hashvalue pour la même entrée que vous pouvez dire de tomcat JDBCRealm d'utiliser cet algorithme pour vérifier les mots de passe.
le problème est que le serveur tomcat, s'attendent à une distincte format pour la usertable comme ceci:
si vos données utilisateur un modèle unique que vous avez de la chance, mais mon Hibernation de la génération de tables ressemblait à ça:
j'ai donc créé un Vue à l'aide de SQL qui avait le format attendu et il dessine de données à partir de mon webapps données de l'utilisateur:
avec tomcat a été en mesure de s'authentifier/autoriser à nouveau ma déjà existantes, les données de l'utilisateur et écrit les données dans le contexte, de sorte que je pouvais l'utiliser dans mon Jersey (JSR-311) ressources:
il y a aussi quelques autres Domaine des implémentations là:
quelques liens:
Si je comprends bien, votre environnement est le framework hibernate basé sur le web application déployée dans tomcat.
Maintenant, actuellement, vous devez avoir configuré JDBC passsword
i) soit dans votre fichier de configuration hibernate (généralement hibernate.cfg.xml fichier) dans la propriété :-
mise en veille prolongée.connexion.mot de passe
ii) ou dans le fichier de configuration de tomcat:-
Maintenant, vous ne souhaitez PAS stocker effacer le mot de passe dans les fichiers.
Dans le code de votre application, vous devez être en train de faire :-
1) d'Une façon peut-être fondamentalement:-
Vous pouvez avoir votre mot de passe crypté à l'aide de toute la sécurité de java alogirthm à l'aide de toute la JCE fournisseur.Stocker le mot de passe crypté dans les fichiers de configuration d'hibernate ou tomcat selon votre environnement de projet).
et puis entre Ligne1 et Ligne2, vous pouvez avoir déchiffrement logique comme:-
Vous pouvez rendre le chiffrement et le déchiffrement aussi complexe que vous le souhaitez pour, par exemple, le chiffrement de la rétro-chaîne-de-claire-mot de passe.
Vous pouvez utiliser n'importe quelle entreprise criminelle commune, l'API:- jasrypt,château gonflable.
Vous avez besoin d'une certaine compréhension de java cryptography.Veuillez vous référer à :-
2)Dans le cas où vous êtes préoccupé par le mot de passe de la transmission en clair dans JDBC protocole de connexion, vous pouvez utiliser le support de SSL à partir de DB fournisseur de connexion sécurisée. Pour, par exemple, d'avoir SSL connexion JDBC avec votre serveur de base de données. Reportez-vous à votre serveur de base de données resoruces pour cela.
permet de dire que vous avez un privé et l'autre paire de clés publique:= privare.la clé et le public.la cer.
Vous pouvez avoir JDBC mot de passe chiffré avec la clé privée et d'enregistrer le mot de passe crypté dans le fichier de configuration. Vous pouvez utiliser OpenSSL pour l'importation de certificat public dans jks (keystore java) fichier et l'avoir dans votre JAVA_HOME\jre\lib\security.
Dans votre déchiffrement logique:-
Donc, dans ce scénario:-
un hacker aurait besoin de 3 choses pour capturer JDBC mot de passe qui rend le système moins vulenrable:-
i) chiffré JDBC mot de passe
ii) JKS magasin
iii) JKS stocker le mot de passe
Vous pouvez poser des questions alors maintenant, que diriez-JKS stocker le mot de passe, bien que ce soit un clé,mot de passe ou le mot de passe de cryptage-décryptage du système, au moins une chose devrait être très sûr; sinon, il jeopradize l'ensemble du système....dans le scénario ci-dessus, le certificat peut être donné à chaque développeur de la machine pour lui permettre de les importer dans son jks de fichiers protégés par le même jks stocker le mot de passe..tout le monde (le développeur) ne saurait seulement JKS stocker le mot de passe mais jamais JDBC mot de passe...
Normalement, vous auriez l'application s'authentifier auprès de la base de données sql sous un seul nom d'utilisateur, en passant les détails de l'utilisateur si nécessaire, car les données de ses interrogations, de sorte que vous renvoyer des données pertinentes à cette fin l'utilisateur. Vos clients précisé que chaque utilisateur doit s'authentifier auprès de la base de données comme un utilisateur distinct?
Pour être en mesure de manière transparente crypter/décrypter les mots de passe de votre base de données avec hibernate vous avez besoin d'intégrer quelque chose comme Jasypt.
Page d'accueil: http://www.jasypt.org
Voir la section: Jasypt + Hibernate 3
Ici est de savoir comment l'intégrer:
Télécharger jasypt.jar et l'ajouter à votre runtime classpath
Je vous recommande d'utiliser un régime enregistré d'encryptor:
Vérifier les réponses à la même question, Comment faire pour utiliser le mot de passe crypté dans apache BasicDataSource?.
Habituellement, cela est géré à l'aide d'un "sysadmin" approche - à l'aide de l'OS:
Le concept de base est "l'externalisation des paramètres de configuration".
Les mots de passe sont stockés en clair dans un "fichier de propriétés" (que le serveur web accède à l'exécution). Les mots de passe sont protégés par la restriction de l'accès aux fichiers à l'aide d'OS au niveau des autorisations de fichier. En règle générale, seuls les "opérations" personnel peut lire/écrire le fichier, et le serveur web a besoin pour s'exécuter avec des privilèges en lecture seule sur le fichier.
Les avantages de cette approche sont:
Vous pouvez utiliser un JDNI source de données sur votre serveur d'application qui permettra d'avoir les informations de connexion pour la Base de données.
Alors vous pouvez simplement dire à votre demande par le biais de votre web.xml utiliser la source de données sur votre serveur d'applications web.
Voici comment je l'ai fait sur un Weblogic 9 de l'utilisation d'Hibernate 3:
Dans Hibernate.cfg.xml
Dans weblogic.xml
Des solutions similaires peuvent être utilisés pour tomcat et d'autres serveurs d'applications:
Tomcat 6 Instructions
J'ai reçu votre point de KyleM. Vous pouvez le faire :
Créer un fichier texte ou de registre(dans le cas de Windows) lieu quelque part sur d'autres serveur en mode crypté.
OU vous pouvez utiliser cette Lamport une époque algorithme de mot de passe