OVH Cloud OVH Cloud

Y a t il une norme des "signes" ?

8 réponses
Avatar
dede
Bonjour à tous et bonne année !

Dans le cadre du projet PyShaPass (https://gna.org/projects/pyshapass)
que j'avais évoqué ici le 28 avril 2005, j'ai mis en place l'idée de
Kevin Drapel pour éviter d'utiliser BASE64 comme "mixer" et j'ai fait le
mien ...

En python, ça donne ça :

def pyshapass_mixer(location, length, uppercase, number, special,
verbose = 0):
"""Mix the SHA with indice instead of base64
"""
alphabet = "abcdefghijklmnopqrstuvwxyz"
if uppercase:
alphabet += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if number:
alphabet += "0123456789"
if special:
alphabet += '=+-/*.!?:%$_&@"''(){}[]'

if verbose:
print "Alphabet=%s" % (alphabet)

la = len(alphabet)
password = ""
for i in range(int(length)):
password += alphabet[ord(location[i]) % la]
return password

Comme vous pouvez le voir dans

alphabet += '=+-/*.!?:%$_&@"''(){}[]'

j'ai rajouté des signes pour faire les mots de passe mais j'hésite sur
quel signe à rajouter ou pas, est ce que ce signe est facile à faire en
qwerty ? Est ce normal d'utiliser ce signe dans un mot de passe ? etc.

Est qu'il existe une norme pour les signes qu'on peut utiliser dans un
mot de passe ? Une liste de conseil sur untel non à cause de ça, celui
là oui à cause de ça, etc. ?

Merci !

8 réponses

Avatar
Nicob
On Fri, 20 Jan 2006 18:05:21 +0100, dede wrote:

Est qu'il existe une norme pour les signes qu'on peut utiliser dans un
mot de passe ? Une liste de conseil sur untel non à cause de ça, celui
là oui à cause de ça, etc. ?


Pas à ma connaissance. Mais insérer des caractères non-imprimables (si
supporté par le système sur lequel on s'authentifie) est souvent une
bonne idée. Mais ce n'est pas très portable ...


Nicob

Avatar
Jean-Marc Desperrier
dede wrote:
Dans le cadre du projet PyShaPass (https://gna.org/projects/pyshapass)
que j'avais évoqué ici le 28 avril 2005, j'ai mis en place l'idée de
Kevin Drapel pour éviter d'utiliser BASE64 comme "mixer" et j'ai fait le
mien ...

[...]
Est qu'il existe une norme pour les signes qu'on peut utiliser dans un
mot de passe ? Une liste de conseil sur untel non à cause de ça, celui
là oui à cause de ça, etc. ?


J'ai relu le message de l'époque :
http://groups.google.fr/group/fr.misc.cryptologie/browse_frm/thread/5623125203ab2244/93392afcd6f405ff

Mais dans cette direction, base64 n'introduit pas de biais(*)

Ce qui ne signifie pas qu'il n'y en a pas un, mais c'est une situation
où il faut éviter de faire confiance à ses yeux et vérifier qu'il y a
réellement un biais et non juste une démonstration des capacité du
cerveau à "voir des motifs" même là où il n'y a rien de plus que du
bruit blanc.

S'il y a réellement un biais, il n'est pas dû au base64 mais aux autres
éléments. Et il faut un peu plus de rechercher pour comprendre où il est
vraiment.

Et changer le mixer ne change rien.


(*) Le caractère avant le signe '=' peut ne pas être équi-réparti, c'est
dû au fait que les données de longueur n en base64 contiennent n*6 bits
de données, et que le nombre y de bits d'aléa réellement générés n'était
pas forcément multiple de 6.

Avatar
dede
Mais dans cette direction, base64 n'introduit pas de biais(*)

Ce qui ne signifie pas qu'il n'y en a pas un, mais c'est une situation
où il faut éviter de faire confiance à ses yeux et vérifier qu'il y a
réellement un biais et non juste une démonstration des capacité du
cerveau à "voir des motifs" même là où il n'y a rien de plus que du
bruit blanc.


Mon cerveau est trop fort pour voir des N et des M :)

S'il y a réellement un biais, il n'est pas dû au base64 mais aux autres
éléments. Et il faut un peu plus de rechercher pour comprendre où il est
vraiment.


Je vois pas où si on prend /dev/random et plusieurs fois de suite.

Et changer le mixer ne change rien.


Un peu quand même. Si on ajoute les signes, ça augmente la force du mot
de passe.

(*) Le caractère avant le signe '=' peut ne pas être équi-réparti, c'est
dû au fait que les données de longueur n en base64 contiennent n*6 bits
de données, et que le nombre y de bits d'aléa réellement générés n'était
pas forcément multiple de 6.


Hum, le pad ... Exact ! Je n'y aurai pas pensé !

Merci.

Avatar
dede
Effectivement, c'est pas très portable :D

Puis ça va être dur à recopier ;)

Donc ça dépend plus des clavier que des OS, suffit de prendre tous les
signes utilisés en C, C++, Java et Python en fait !
On cherche les signes des trucs portables et hop !

On Fri, 20 Jan 2006 18:05:21 +0100, dede wrote:


Est qu'il existe une norme pour les signes qu'on peut utiliser dans un
mot de passe ? Une liste de conseil sur untel non à cause de ça, celui
là oui à cause de ça, etc. ?



Pas à ma connaissance. Mais insérer des caractères non-imprimables (si
supporté par le système sur lequel on s'authentifie) est souvent une
bonne idée. Mais ce n'est pas très portable ...


Nicob



Avatar
dede
dede wrote:
http://groups.google.fr/group/fr.misc.cryptologie/browse_frm/thread/5623125203ab2244/93392afcd6f405ff


J'ai relancé le code fourni et ça me sort de grande colonne de M quand
même ... :/

Avatar
Jean-Marc Desperrier
dede wrote:
dede wrote:
http://groups.google.fr/group/fr.misc.cryptologie/browse_frm/thread/5623125203ab2244/93392afcd6f405ff


J'ai relancé le code fourni et ça me sort de grande colonne de M quand
même ... :/


Je crois que j'ai trouvé la source du problème.

C'est quoi hexdigest() ?

J'ai l'impression que tu commence par convertir les données en
hexadecimal avant d'encoder en base64.

Donc la source de donnée que tu encode en base64 ne varie que sur 16
valeurs pour chaque octet au lieu de 256. 16 valeurs réparties sur deux
bloc où elles se suivent donc c'est principalement les bits de poids
faible qui changent.

Et chaque caractère du base64 ne représente que 6 bits de tes données
d'entrée, donc au début d'un bloc les 6 bit de poid fort ce qui élimine
les 2 qui changent le plus.

Donc finalement l'oeil n'a pas été très performant car il n'y vu que le
grand nombre de N et M, alors qu'il y a surtout très peu de variation
dans les caractères présents dans cette première colonne, et que cela se
répète dans tout le tableau tous les 4 caractères avec une proportion
énorme de N, M, O, Y ou Z.

Cependant à l'arrivée, pas de véritable biais, juste une grande
inefficacité, chaque bloc de 4 caractères base64 encode 12 bits au lieu
de 24.


Avatar
dede
dede wrote:
dede wrote:
http://groups.google.fr/group/fr.misc.cryptologie/browse_frm/thread/5623125203ab2244/93392afcd6f405ff



J'ai relancé le code fourni et ça me sort de grande colonne de M quand
même ... :/


Je crois que j'ai trouvé la source du problème.

C'est quoi hexdigest() ?

J'ai l'impression que tu commence par convertir les données en
hexadecimal avant d'encoder en base64.

Donc la source de donnée que tu encode en base64 ne varie que sur 16
valeurs pour chaque octet au lieu de 256. 16 valeurs réparties sur deux
bloc où elles se suivent donc c'est principalement les bits de poids
faible qui changent.

Et chaque caractère du base64 ne représente que 6 bits de tes données
d'entrée, donc au début d'un bloc les 6 bit de poid fort ce qui élimine
les 2 qui changent le plus.

Donc finalement l'oeil n'a pas été très performant car il n'y vu que le
grand nombre de N et M, alors qu'il y a surtout très peu de variation
dans les caractères présents dans cette première colonne, et que cela se
répète dans tout le tableau tous les 4 caractères avec une proportion
énorme de N, M, O, Y ou Z.

Cependant à l'arrivée, pas de véritable biais, juste une grande
inefficacité, chaque bloc de 4 caractères base64 encode 12 bits au lieu
de 24.


Oh trop fort ! J'étais sur que c'était un truc du genre :/

De http://python.org/doc/2.4.2/lib/module-sha.html :
hexdigest()
Like digest() except the digest is returned as a string of length
40, containing only hexadecimal digits. This may be used to exchange the
value safely in email or other non-binary environments.

En fait ça vient de la partie shell visible dans
http://svn.gna.org/viewcvs/pyshapass/trunk/fun/

Si on compare

import getpass, sha, base64;print
base64.encodestring(sha.new(getpass.getpass()+raw_input("Location:
")).hexdigest())[0:8]

et

echo -n $pass$www | openssl sha1 | openssl base64 | cut -b 1,2,3,4,5,6,7,8

La partie python a été faite pour donner le même résultat que la partie
shell or c'est apparement ce qu'il se passe (la conversion hexa) sans
que ce soit demandé ...

La sortie de openssl sha1 est en hexa :/ J'avais jamais remarqué ...
Au lieu de chercher dans le module sha de python ce qui donnait le même
résultat, j'aurais pu réfléchir un peu plus ...

Pffff Désolé !

En tout cas, c'est embétant ça car si on peut pas forcer la sortie
binaire de openssl il n'y aura pas de version shell :/

En tout cas merci beaucoup !!!
Bon départ de week end ;)



Avatar
dede
dede wrote:
dede wrote:
http://groups.google.fr/group/fr.misc.cryptologie/browse_frm/thread/5623125203ab2244/93392afcd6f405ff




J'ai relancé le code fourni et ça me sort de grande colonne de M
quand même ... :/


Je crois que j'ai trouvé la source du problème.

C'est quoi hexdigest() ?

J'ai l'impression que tu commence par convertir les données en
hexadecimal avant d'encoder en base64.

Donc la source de donnée que tu encode en base64 ne varie que sur 16
valeurs pour chaque octet au lieu de 256. 16 valeurs réparties sur
deux bloc où elles se suivent donc c'est principalement les bits de
poids faible qui changent.

Et chaque caractère du base64 ne représente que 6 bits de tes données
d'entrée, donc au début d'un bloc les 6 bit de poid fort ce qui
élimine les 2 qui changent le plus.

Donc finalement l'oeil n'a pas été très performant car il n'y vu que
le grand nombre de N et M, alors qu'il y a surtout très peu de
variation dans les caractères présents dans cette première colonne, et
que cela se répète dans tout le tableau tous les 4 caractères avec une
proportion énorme de N, M, O, Y ou Z.

Cependant à l'arrivée, pas de véritable biais, juste une grande
inefficacité, chaque bloc de 4 caractères base64 encode 12 bits au
lieu de 24.


Oh trop fort ! J'étais sur que c'était un truc du genre :/

De http://python.org/doc/2.4.2/lib/module-sha.html :
hexdigest()
Like digest() except the digest is returned as a string of length
40, containing only hexadecimal digits. This may be used to exchange the
value safely in email or other non-binary environments.

En fait ça vient de la partie shell visible dans
http://svn.gna.org/viewcvs/pyshapass/trunk/fun/

Si on compare

import getpass, sha, base64;print
base64.encodestring(sha.new(getpass.getpass()+raw_input("Location:
")).hexdigest())[0:8]

et

echo -n $pass$www | openssl sha1 | openssl base64 | cut -b 1,2,3,4,5,6,7,8

La partie python a été faite pour donner le même résultat que la partie
shell or c'est apparement ce qu'il se passe (la conversion hexa) sans
que ce soit demandé ...

La sortie de openssl sha1 est en hexa :/ J'avais jamais remarqué ...
Au lieu de chercher dans le module sha de python ce qui donnait le même
résultat, j'aurais pu réfléchir un peu plus ...

Pffff Désolé !

En tout cas, c'est embétant ça car si on peut pas forcer la sortie
binaire de openssl il n'y aura pas de version shell :/

En tout cas merci beaucoup !!!
Bon départ de week end ;)


Voilà l'option "-binary" de openssl résoud le schmilblick ...

Merci beaucoup !