Comment puis-je hacher des mots de passe dans postgresql?

je dois hachez quelques mots de passe avec salt sur postgresql, et je n'ai pas été en mesure de trouver une documentation pertinente sur la façon d'obtenir ce fait.

alors comment puis-je hacherles mots de passe (avec quelques sels) dans postgresql?

41
demandé sur rook 2010-04-15 20:30:42

3 réponses

Cela fait longtemps que j'ai posé cette question, et je suis beaucoup plus familier avec la théorie cryptographique maintenant, Donc voici l'approche plus moderne:

raisonnement

  • N'utilisez pas md5. Ne pas utiliser un seul cycle de Sha-famille coups rapides. Les coups de fouet rapides aident les attaquants, donc vous ne voulez pas ça.
  • utilisez plutôt un hachage à forte intensité de ressources, comme bcrypt. Bcrypt est testé dans le temps et à des échelles jusqu'à être l'avenir-mesure.
  • ne vous donnez pas la peine de rouler votre propre sel, vous risquez de ruiner votre propre sécurité ou portabilité, comptez sur gen_salt() pour générer ses propres sels uniques à chaque utilisation.
  • en général, ne soyez pas un idiot, n'essayez pas d'écrire votre propre crypto maison, utilisez juste ce que les gens intelligents ont fourni.

Debian/Ubuntu installer des paquets

sudo apt-get install postgresql   // (of course)
sudo apt-get install postgresql-contrib libpq-dev   // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql   // (optional if you're using postgresql with php)

Active crypt() et bcrypt dans postgresql dans votre base de données

// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension

utiliser crypt () et gen_salt () dans les requêtes

comparer: passage au hachage existant avec:

select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)

créer un hachage de: mot de passe avec un grand sel aléatoire:

insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)

De l'-en-Php bcrypt de hachage est légèrement préférable

il y a des fonctions password_* dans php 5.5 et au-dessus qui permettent un mot de passe trivialement simple le hachage avec bcrypt (au sujet du temps!), et il y a une bibliothèque de compatibilité arrière pour les versions en dessous. généralement que le hachage retombe à envelopper un appel système linux pour une utilisation CPU plus faible de toute façon, bien que vous puissiez vouloir vous assurer qu'il est installé sur votre serveur. Voir: https://github.com/ircmaxell/password_compat (nécessite php 5.3.7+)

attention de l'exploitation forestière

notez qu'avec pg_crypto, le les mots de passe sont en clair tout au long de la transmission du navigateur, à php, à la base de données. Cela signifie qu'ils peuvent être connectés en clair à partir de requêtes Si vous n'êtes pas prudent avec vos journaux de base de données. par exemple, avoir un journal de requête lent postgresql pourrait saisir et enregistrer le mot de passe à partir d'une requête de connexion en cours.

En Résumé

utilisez php bcrypt si vous le pouvez, cela diminuera le temps que le mot de passe reste inachevé. Essayez de assurez-vous que votre système linux dispose de bcrypt installé dans son crypt() donc c'est performant. La mise à niveau vers au moins php 5.3.7+ est fortement recommandée car l'implémentation de php est légèrement boguée de php 5.3.0 à 5.3.6.9, et retombe de manière inappropriée sur le DES cassé sans avertissement dans php 5.2.9 et inférieur.

si vous voulez/avez besoin de hashing in-postgres, l'installation de bcrypt est la solution, car les hashs installés par défaut sont vieux et cassés (md5, etc).

Voici des références pour plus de lecture sur le sujet:

68
répondu Kzqai 2016-10-13 19:25:52

une application doit hachurer ses mots de passe en utilisant la fonction de dérivation des clés comme bcrypt ou pbkdf2. voici plus d'informations sur le stockage sécurisé des mots de passe .

... mais parfois vous avez encore besoin de fonctions cryptogrpahic dans une base de données.

vous pouvez utiliser pgcrypto pour accéder à sha256 qui est un membre de la famille sha2. Gardez à l'esprit sha0,sha1 md4 et md5 sont très cassé et doit jamais être utilisé pour le hachage de mots de passe.

ce qui suit est une méthode correcte de hachage des mots de passe:

digest("salt"||"password"||primary_key, "sha256")

le sel doit être une grande valeur générée au hasard. Ce sel doit être protégé, car les hachures ne peuvent être brisées tant que le sel n'est pas récupéré. Si vous stockez le sel dans la base de données, alors il peut être obtenu avec le hachage de mot de passe en utilisant l'injection sql. Concaténation de la clé primaire est utilisé pour empêcher 2 personnes d'avoir le même hachage mot de passe, même si elles ont le même mot de passe. Bien sûr, ce système pourrait être amélioré, mais c'est beaucoup mieux que la plupart des systèmes que j'ai vu.

en général, il est préférable de faire du hachage dans votre application avant qu'elle n'atteigne la base de données. C'est parce que les querys peuvent apparaître dans les journaux, et si le serveur de base de données a été possédé alors ils pourraient activer la journalisation pour obtenir des mots de passe de texte clairs.

16
répondu rook 2017-05-23 12:18:00

exemples et documentation sur: http://www.postgresql.org/docs/8.3/static/pgcrypto.html

UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));

SELECT pswhash = crypt('entered password', pswhash) FROM ... ;
8
répondu Matej Puntar 2016-04-27 16:19:35