8723 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je stocke mes données sous Postgres et je hache les mots de passe avec l'algorithme argon2.

Je me pose donc la question de savoir quel champ serait le plus optimisé pour stocker cette donnée : BYTEA ?

Étonnamment je ne trouve pas facilement l'info (sans doute parce qu'aujourd'hui, la plupart du temps, on délègue cette tâche aux ORM).
Modérateur
Salut Olivier,

Il n'y a pas grand chose à dire sur le Bytea. ¹ Le Bytea permet de stocker du binaire. Or, tu souhaites stocker une chaine de caractères. Un VARCHAR bien paramétré te suffit amplement. Perso, j'utilise le SHA256 et je demande à l'utilisateur un mot de passe de 8 cars. minimums avec chiffres, majuscules et caractères de ponctuations ou autres. Aussi, le mot de passe ne doit pas être courant (même en leet code). Sinon, ce sera refusé. Ce qui veut dire que mon type de champ est simple. Par contre, la donnée en elle-même est complexe

Olivier C a écrit :


Étonnamment je ne trouve pas facilement l'info (sans doute parce qu'aujourd'hui, la plupart du temps, on délègue cette tâche aux ORM).


En effet. Il me semble que le Bytea est spécifique à Postgresql. Il n'est pas étonnant que les ORM n'utilisent pas ce type de champ dans les models.

Espérant t'avoir aidé,
bien à toi

edit:
¹ Un petit tour sur la doc officielle t'aidera peut-être
Modifié par niuxe (03 Feb 2024 - 10:45)
Meilleure solution
Non mais c'est sûr, je suis allé chercher midi à quatorze heure, au final je viens de configurer un VARCHAR(255) (pas de CHAR car les chaînes de argon2 varient selon le mot de passe).

En fait je suis allé chercher loin car je me suis laissé influencer par... ChatGPT Smiley confused

Et, oui, tu as raison, j'ai une tendance à faire de la sur-ingénierie par rapport à mes besoins. Par contre, SHA256, c'est de la crypto, byscript et argon2 c'est pour le hachage (non réversible) ce n'est pas tout à fait la même chose...

PS : autant pour moi, j'ai confondu SHA-256 (de la famille "SHA-2" que je ne connaissais même pas) avec SHA-1.
Modifié par Olivier C (04 Feb 2024 - 03:17)
Hello Olivier,

Pour stocker les mots de passe je te conseille SHA-512 (SHA-256 étant déjà considéré obsolète) ou Bcrypt comme fonctions de hachage. Bcrypt resiste mieux aux attaques par dictionnaire car l’algorithme induit du « sel » dans le hash. Et t’embête pas avec le type de colonne dans la base de donnée, utilise VARCHAR.

En espérant avoir répondu à ta question Smiley smile
Merci Anymah,

Oui j'avais vu pour SHA-256, après que Niuxe en ait parlé ici je suis allé faire l'état des lieux.

Par contre, effectivement, je n'ai pas pensé que ces algorithmes SHA-2 puissent être disponibles dans Node.js (en fait j'avais oublié que Node.js s'était équipé en crypto) ; Cf. node.js crypto hash :
crypto.createHash('sha512')

Quoi qu'il en soit, quitte à importer une lib' et devoir choisir entre Bycrypt et Argon2, autant prendre le top, donc Argon2 (cf. npm argon2). C'est ce que j'ai fais et ça fonctionne très bien.
Modifié par Olivier C (05 Feb 2024 - 17:08)
Modérateur
Anymah a écrit :
...(SHA-256 étant déjà considéré obsolète) ...


Bien sûr que non il n'est pas obsolète. C'est une solution parmi tant d'autres. Sinon, ce serait le bordel dans les banques. La plupart des transactions se font avec ce hachage. Il suffit de l'utiliser correctement.

La probabilité de retrouver une chaine de 8 caractères (n'importe lesquels) est un peu moins de 4 295 000 000 (2³² * 8). Au petit hacker en herbe, je lui dis : bonne chance (surtout si on rajoute un peu de sel) ! Et puis, une attaque par brute force, c'est simple à contrer...

L'avantage d'utiliser cet algo, est qu'il n'est pas si commun que ça. Souvent, c'est le MD5....
Modifié par niuxe (05 Feb 2024 - 14:09)