Apprendre à coder ? Apprendre l’informatique ? Apprendre le numérique ?

Code python dans vim, photo sous licence CC de moleculea

Photo : Vim + NERDTree + Taglist par moleculea

J’ai participé samedi dernier à une conversation sur Twitter sur la question de l’utilité d’apprendre à coder au collège ou au lycée :

On peut distinguer deux grands pôles dans les débats sur ce sujet :

  • Le pôle « pratiques » selon lequel il suffit d’apprendre aux élèves à utiliser le numérique sans leur demander d’entrer dans la technique informatique sous-jacente.
  • Le pôle « techniques » qui considère que pour bien utiliser le numérique il faut savoir comment il fonctionne et donc apprendre à programmer.

Étrangement, il semble qu’il y ait peu de positions intermédiaires entre ces deux pôles. A priori et depuis longtemps, je suis plutôt du côté des « pratiques » : je ne connais rien au fonctionnement de ma voiture et ça ne m’empêche pas de faire 50000 km par an. Toutefois, avec le temps, j’en suis venu à nuancer cette position et à me dire qu’un apprentissage de certaines notions d’informatique serait utile.

Voici donc quelques réflexions à ce sujet (en plus de 140 caractères 😉 ) sur lesquelles je vous invite à réagir (en commentaires ici même par exemple, ou sur Twitter).

Questions de vocabulaire

Mes lecteurs fidèles savent que j’aime bien préciser le vocabulaire avant de discuter une question. C’est souvent un préalable indispensable sur ce qui touche au numérique où les buzzwords et les petits-mots-pour-avoir-l’air-savant-ou-à-la-mode-ou-les-deux-en-même-temps sont souvent très répandus, sans que personne ne comprenne vraiment ce qu’ils signifient (précisément parce qu’ils n’ont pas le même sens pour tout le monde).

Il faut donc s’entendre sur ce qu’on appelle ‘coder’. Dès ce point, un problème va se poser : classiquement, le verbe ‘coder’ (qui provient de l’anglais ‘to code’), pour le sens qui nous intéresse, signifie écrire du code informatique, c’est-à-dire du code exécutable. Il est un synonyme de programmer, c’est-à-dire ‘produire un programme informatique’. Ainsi, coder, c’est écrire dans des langages de programmation, comme C, C++, Java, Python, Ruby, Lisp, Cobol, Basic, Javascript, PHP… (et beaucoup d’autres) pour fournir des instructions à un ordinateur : « affiche une fenêtre », « écris telle phrase à l’écran », « fais tel calcul », « trouve telle information dans tel fichier » etc.

Par un glissement de sens subtil, ce verbe en est venu à signifier « écrire des choses incompréhensibles pour le commun des mortels mais qui fait sens pour un ordinateur ». C’est ainsi qu’on en arrive à parler de coder pour « écrire du HTML ». Le HTML n’est pas un langage de programmation, mais un langage de description de page. Il ne permet pas de dire à l’ordinateur de faire un calcul, par exemple, il se contente de lui dire que tel mot doit apparaître dans telle couleur, à telle position, dans telle taille de caractères. En fait, j’aurai l’occasion de parler plus tard de ces questions.

Si je me permets cette (trop) longue digression sur les sens du mot ‘coder’, ceux qu’il a réellement et ceux qu’on lui attribue un peu trop généreusement, c’est que, je crois, par une sorte d’admirable mise en abyme, la question de « pourquoi apprendre à coder » se trouve posée dans cette expression même. Il me semble en effet que si nous avions tous une expérience plus concrète de ce qu’est l’informatique, ces glissements de sens n’existeraient pas, non plus que les incroyables dialogues de sourds auxquels ils donnent parfois lieu. J’y reviendrai.

Deux autres définitions pourront être utiles. Comme je suis épuisé par la première (et que, je l’avoue, j’ai peur de lasser mes lecteurs avec mes définitions approximatives), je vais emprunter celles-là à l’Académie des Sciences (avouez qu’entre une de mes définitions et une autre écrite par des académiciens, vous ne perdez pas au change) :

  • Le mot « informatique » désignera spécifiquement la science et la technique du traitement de l’information, et, par extension, l’industrie directement dédiée à ces sujets.
  • L’adjectif « numérique » peut être accolé à toute activité fondée sur la numérisation et le traitement de l’information : photographie numérique, son numérique, édition numérique, sciences numériques, art numérique, etc.

On parle ainsi de « monde numérique » pour exprimer le passage d’un nombre toujours croissant d’activités à la numérisation de l’information et « d’économie numérique » pour toutes les activités économiques liées au monde numérique, le raccourci « le numérique » rassemblant toutes les activités auxquelles on peut accoler l’adjectif numérique. Puisque toute information numérisée ne peut être traitée que grâce à l’informatique, l’informatique est le moteur conceptuel et technique du monde numérique.

(Rapport de l’Académie des sciences. L’enseignement de l’informatique en France. Il est urgent de ne plus attendre., p. 8)

Les deux pôles du débat

Comme je le disais plus haut, il me semble que sur cette question on peut distinguer deux pôles. Deux textes me semblent emblématiques de chacun de ces deux pôles :

Le pôle « technique » : rapport de l’Académie des sciences

Les auteurs du rapport partent du constat suivant :

  • Le développement du numérique est intimement lié aux progrès de l’informatique, qui est devenue une science autonome avec ses formes de pensée spécifiques. Si les objets et applications numériques évoluent à allure soutenue, la science informatique reste fondée sur un ensemble stable et homogène de concepts et de savoirs.
  • Nombre des progrès technologiques les plus marquantes de ces dernières années sont des produits directs de l’informatique : moteurs de recherche et traitement de très grandes masses de données, réseaux à très large échelle, informatique sûre embarquée dans les objets, etc.
  • De par l’universalité de son objet, la science informatique interagit de façon étroite avec pratiquement toutes les autres sciences. Elle ne sert plus seulement d’auxiliaire de calcul, mais apporte des façons de penser nouvelles.

(Rapport de l’Académie des sciences. L’enseignement de l’informatique en France. Il est urgent de ne plus attendre., p. 3)

Ils estiment donc nécessaire d’enseigner la science informatique dès l’école primaire, en proposant une progression jusqu’au lycée (et même au-delà):

  1. La sensibilisation, principalement au primaire, qui peut se faire de façon complémentaire en utilisant des ordinateurs ou de façon « débranchée » ; un matériau didactique abondant et de qualité est d’ores et déjà disponible.
  2. L’acquisition de l’autonomie, qui doit commencer au collège et approfondir la structuration de données et l’algorithmique. Une initiation à la programmation est un point de passage obligé d’activités créatrices, et donc d’autonomie.
  3. Le perfectionnement, qui doit se faire principalement au lycée, avec un approfondissement accru des notions de base et des expérimentations les plus variées possibles.

(Rapport de l’Académie des sciences. L’enseignement de l’informatique en France. Il est urgent de ne plus attendre., p. 4)

Cet enseignement passe la création d’une nouvelle discipline, qui doit être enseignée à tous les jeunes, en adaptant les exercices et les objectifs au niveau d’enseignement et (au lycée) aux options et aux filières choisies. Le rapport prévoit aussi la formation des enseignants qui seraient amenés à enseigner cette nouvelle matière : formation des enseignants de premier degré pour qu’ils puissent enseigner cette matière comme ils enseignent déjà les autres, création de concours CAPES/Agrégation pour former les nouveaux enseignants d’informatique du secondaire.

Les finalités de cet enseignement sont les suivantes (p. 13 sq.):

– « Former les professionnel-le-s de tous les métiers » : puisque de plus en plus de métiers utilisent l’informatique ou ont à traiter de questions qui sont liées à ce domaine, les professionnels qui les pratiquent doivent pouvoir le comprendre d’une façon satisfaisante. Un exemple est particulièrement éclairant à cet égard :

Par exemple, les juristes sont de plus en plus souvent amenés à écrire et appliquer des lois qui concernent des questions liées à l’informatique. L’expérience récente montre que leur difficulté à comprendre et suivre le sujet mène à des retards permanents dans l’action, voire à des contresens, comme on en a vus sur questions d’identification, de vote électronique ou de protection de la vie privée : croyance répandue mais erronée qu’une adresse IP (dans sa version 4 actuelle) identifie un ordinateur, confiance a priori dans le vote électronique certainement pas partagée par les spécialistes de la sécurité informatique, etc. »

(Rapport de l’Académie des sciences. L’enseignement de l’informatique en France. Il est urgent de ne plus attendre., p. 14)

– « L’alphabétisation numérique pour tous » : les auteurs insistent, à juste titre à mon avis, sur le fait que la fracture numérique n’est pas tant entre ceux qui sont équipés de matériel informatique et ceux qui n’en sont pas équipés qu’entre ceux qui savent s’en servir efficacement et ceux qui ne savent pas. Le numérique est porteur de beaucoup de promesses pour améliorer la société : plus de transparence, plus grande liberté d’expression, accès facilité à l’information et à l’éducation etc. mais aussi de certaines menaces. Il importe que les citoyens puissent à la fois tirer profit de ces avantages et contrôler le développement du numérique dans la société. Pour cela il est nécessaire de les former à mieux comprendre ces questions par une éducation à l’informatique.

(Je passe sur la finalité suivante « Réduire les fractures numériques de genre et de catégorie sociale » qui n’est pas autre chose, à mon avis, qu’une petite glose politiquement correcte pour faire bonne mesure, puisque rien d’autre de sérieux n’est dit à ce sujet dans le rapport).

Ce sur quoi le rapport insiste à plusieurs reprises, c’est sur la nécessité d’apprendre aux élèves des concepts et non des procédures : « Il faut donc systématiquement rechercher l’enseignement des fondements et des concepts, au lieu de former les élèves aux détails d’outils vite périmés, faute de quoi les élèves se périmeront aussi vite que les objets enseignés » (p.17).

Le pôle « pratiques » : article de Michel Guillou « Apprendre à exercer sa liberté d’expression ou apprendre à coder »

(NB : je choisis cet article parce qu’il me semble assez caractéristique de ce que j’ai appelé le pôle « pratiques », même si je dois à la vérité de préciser qu’il ne résume pas toute le pensée de Michel Guillou sur ce sujet. En somme, je le prends comme exemple d’une position sur la question dont je parle, non comme exemple des réflexions de son auteur, par ailleurs plus subtiles et plus complexes que cela.)

Michel Guillou considère cette proposition de créer une nouvelle matière d’enseignement « pitoyable et dérisoire » et estime que les arguments avancés sont fallacieux :

Je cite Benoît Thieulin, président du CNN qui s’est maladroitement engouffré dans l’espace ouvert par l’EPI, les informaticiens de l’Académie des Sciences et la Société informatique de France, qui disait dans L’Express : « Une nouvelle culture numérique émerge pour laquelle les gens ne sont pas formés. Il faut donc enseigner un minimum de culture générale dans ce domaine dès le primaire. Tout le monde doit savoir ce qu’est un logiciel et comment il est conçu, par des couches de codes de langages informatiques ». Vous l’avez compris, c’est le syllogisme habituel : une nouvelle culture numérique est nécessaire, l’informatique en est le cœur donc il faut enseigner l’informatique et le code !

Il récuse ensuite l’idée que l’informatique soit absente des enseignements actuels :

Quant à l’idée que l’informatique serait absente des enseignements d’aujourd’hui, c’est une idée fausse bien sûr. La maîtrise des techniques usuelles de l’information et de la communication fait partie de la quatrième compétence exigible pour le socle commun et pour le B2i, aussi imparfait soit-il, les items de laquelle compétence pouvant être validés dans n’importe quelle discipline, des mathématiques à la technologie en passant par la documentation, souvent pionnière en la matière. Par ailleurs, et s’il faut absolument parler des programmes disciplinaires, faut-il rappeler qu’il existe déjà un enseignement optionnel de l’informatique et des sciences du numérique qui devrait être proposé bientôt, si on trouve les professeurs pour les encadrer, à toutes les classes de terminale ? Faut-il rappeler aussi que les programmes de technologie, au premier degré comme dans les collèges, contiennent de très nombreuses références à l’enseignement de l’informatique, dont la compréhension du code ?

Je dois avouer que cette partie de l’article me rend un peu perplexe : en ce qui concerne l’enseignement optionnel de l’informatique et des sciences du numérique, précisément, il est optionnel et ne peut donc pas être considéré comme susceptible de fournir une culture générale de base sur l’informatique. Dans le programme de technologie, je ne vois pas les « très nombreuses références à l’enseignement de l’informatique, dont la compréhension du code ». Je vois quelques références à l’informatique, qui me semble plutôt vue selon une perspective très technique et procédurale, je vois aussi que la seule mention du code est négative : « La programmation d’un support automatique ne demande pas l’écriture de lignes de code. » (Programmes de l’enseignement de technologie, Bulletin officiel de l’Education nationale spécial n° 6 du 28 août 2008, p. 22)

Sur la question du socle commun et du B2i, je n’ai aucun doute ; ce passage est de toute évidence une facétie de Michel Guillou, qui écrivait naguère au sujet du B2i, qu’il qualifiait d' »échec monumental » :

Au moment où il convient maintenant, compte tenu de l’urgence, d’enseigner le numérique et de prendre à ce sujet des décisions, la seule chose sensée à faire est d’annoncer la suppression de ce machin, par ailleurs particulièrement mal nommé.

Définitive, la suppression, de préférence..

Comme de décider de la suppression de la compétence 4 dont les items intègrent aisément l’ensemble des autres compétences, comme j’ai déjà eu l’occasion de le démontrer. Pour y revenir et n’évoquer, par exemple, que les compétences 6 et 7, comment travailler sur « les droits et les devoirs du citoyen » ou « les notions de responsabilité et de liberté et le lien qui existe entre elles » hors de toute référence au numérique qui imprègne les pratiques ordinaires de ces jeunes citoyens ?

(Avoir parfois le courage de renoncer)

Il sait très bien, comme tout le monde, que les items du B2i sont très peu enseignés, en particulier les plus « théoriques », qui sont ceux qui nous intéressent en ce moment.

Mais cela n’est pas l’essentiel de cet article. Le cœur du propos de son auteur est de dire que la vraie priorité pour maîtriser le numérique, plutôt qu’une éducation à l’informatique, est d’apprendre à exercer sa liberté d’expression par le numérique, à publier : « Je suis donc persuadé que l’exercice de ce droit s’apprend, dans le cadre d’une éducation aux médias rénovée, et doit faire partie des nouvelles compétences auxquelles il faut former le jeune citoyen ».

Deux positions irréconciliables ?

On le voit, ces deux pôles correspondent à deux positions très tranchées : création d’une discipline supplémentaire « informatique » comprenant l’apprentissage du code dans un cas, éducation aux médias rénovée dispensée de façon pluridisciplinaire dans l’autre cas.

Il semble difficile de mettre d’accord les tenants de ces deux positions. Pourtant, il faut reconnaître que les deux textes se proposent des objectifs communs : dans les deux cas, il s’agit de former des citoyens conscients, capables de faire des choix éclairés et d’exercer leur liberté d’expression.

Ils ont aussi, me semble-t-il, un autre point commun (et j’espère que ni les uns ni les autres ne prendront ombrage de cette remarque) : une rhétorique prédéterminée par certaines conceptions préalables.

Le vice logique du rapport de l’Académie des sciences est dans une certaine mesure mis en lumière par Michel Guillou dans la citation que j’ai faite plus haut : le numérique induit un changement du monde dans lequel nous vivons, la science informatique est à la base du numérique, donc il faut apprendre la science informatique et la programmation. Si on peut suivre le raisonnement jusqu’à apprendre la science informatique (c’est-à-dire une théorie du traitement de l’information), on ne voit pas très bien pourquoi la technique informatique (le code) arrive ici. C’est ce que j’appellerais la « logique du blop » : un élément arrive dans le discours par la seule raison de sa contiguïté avec un autre qui a été amené logiquement (il apparaît comme une bulle qui éclate sans qu’on s’y attende à la surface du porridge, en faisant « blop »).

Quant au raisonnement de Michel Guillou, je le qualifierais de « logique gaullienne » : le numérique pose des questions sur la société auxquelles il appartient au citoyen de répondre, il faut donc une éducation à la citoyenneté, les questions techniques étant des détails. Par conséquent, je forme un citoyen et l’intendance (numérique) suivra (d’où le nom de cette logique 😉 ). Je crois que depuis la création du B2I en 2000, l’intendance n’a pas toujours suivi comme on l’aurait voulu…

[A suivre… Dans un prochain billet, je dirai ce que je pense de l’enseignement de l’informatique]

L’âge du péta-octet…

Mon fils de bientôt cinq ans, qui, comme beaucoup de ses semblables, n’est pas chiche d’hyperboles, m’a demandé pendant l’été ce qu’il y a après « méga » (parce que mieux que superbien, c’est mégabien), puis ce qu’il y a après « giga »… Lorsque, quelques jours plus tard, il m’a demandé ce qu’il y a après « téra », je dois avouer que j’ai séché et ce n’est qu’après une recherche sur le web que j’ai pu lui répondre « péta » (mais en tant que parent responsable, j’ai néanmoins pris la peine de lui expliquer que le terme « pétabien » risquait de ne pas être intelligible pour tous).

Aussi ai-je particulièrement prêté l’oreille (devrais-je dire l’oeil ?) quand j’ai découvert, par l’intermédiaire d’Olivier Ertzscheid, l’article de Chris Anderson traitant de l’impact de l’Age du Pétaoctet sur la méthode scientifique. Depuis, Hubert Guillaud a écrit un article de synthèse très intéressant sur la fin de la science, dans lequel il évoque cet article : Est-ce que le déluge de données va rendre la méthode scientifique obsolète ?. Mais ce n’est pas de cet impact sur la science que je veux parler ici ; cet article m’a inspiré quelques réflexions, qui rencontrent des préoccupations que j’ai depuis longtemps.

D’abord cette idée d’un déluge de données dans lequel des logiciels pourraient trouver un sens automatiquement (l’exemple le plus saisissant est celui de la traduction : « à corpus de données égal, Google peut traduire du klingon en persan aussi facilement qu’il peut traduire du français en allemand », dit Anderson) me semble mettre en évidence une tendance importante et durable de l’internet actuel : la domination d’un système fonctionnant avec des données peu structurées, au détriment d’un système plus rigoureux et plus structuré. En somme, il s’agit d’une victoire du web 2.0 (ou 3.0, je ne compte plus) sur le web sémantique. C’est ce principe qui s’applique pour le moteur de recherche de Google ou les sites de signets collaboratifs comme del.icio.us : on ne demande pas au fournisseur de contenu (pages web ou liens dans ces exemples) de faire une description exhaustive de son contenu ; à la rigueur, on lui demande quelques mots clés (tags), mais cela ne va guère au-delà. Il me semble que cette tendance se confirme d’une façon très nette et que la mise en place d’un formalisme imposant de taxinomies et d’ontologies qu’on nous promet parfois n’aura pas lieu, en tout cas pas dans les dix ans qui viennent. A la place, le web continuera à être une sorte de vrac dans lequel les ordinateurs devront se débrouiller pour trouver un sens (quel qu’il soit), et non un objet bien propre spécialement fabriqué pour qu’ils le comprennent.

A cet égard, le billet de Jean Véronis sur la nouvelle fonctionnalité de Google de détection de pièce jointes oubliées, dans lequel il explique la méthode qu’il utiliserait pour implémenter cette fonction est un témoignage éloquent. Cette méthode donne véritablement le vertige : il s’agit d’ « extraire à l’aide d’outils statistiques les n-grammes qui apparaissent fréquemment dans les mails avec attachement et pas dans les mails sans attachement », puis « pour chaque nouveau mail, regarder si un de ces n-grammes magiques est présent dans le texte, et si oui déclencher une alerte ».

D’ailleurs, je crois que l’époque est au refus d’un formalisme excessif. Le succès d’une méthode comme GTD n’est sans doute pas étranger à ce refus : un projet, tel que le décrit David Allen, n’est pas un ensemble complexe de systèmes et de sous-systèmes, qui peut être représenté de diverses façons (diagramme de Gantt, de PERT…) ; c’est plutôt un ensemble d’actions qui peut être consigné sur le dos d’une enveloppe et dont la représentation essentielle est la Next action, c’est-à-dire « Et maintenant qu’est-ce qu’on fait ? »

En somme, le principe directeur, connu depuis toujours, est que « le Mieux est l’ennemi du Bien » et plutôt que d’avoir un modèle qui prévoit tout, il vaut mieux avoir un modèle facile à adapter quand on aura besoin de lui faire faire quelque chose d’imprévu… Les méthodes de programmation dites « agiles » ne reposent pas sur autre chose.

Mais aussi cette situation a un impact sur l’informatique en général : d’abord parce qu’elle peut contribuer à populariser l’idée qu’un ordinateur doit travailler à la place d’un humain et non lui donner du travail… Truisme… mais qui ne paraît pas si évident pour tous nos semblables : l’ami qui m’a dit il y a quelques années « Pourquoi as-tu 2 (ou 3 ou 6…) ordinateurs, tu ne peux pas être assis devant tous en même temps ? », sans savoir qu’un bon ordinateur est précisément celui que j’utilise sans être assis devant lui, ou bien ceux qui ne veulent pas utiliser l’informatique parce qu’ils n’ont pas le temps…

Je crois que cette tendance a aussi une conséquence sur le métier d’informaticien. En effet, de nos jours, il est possible de programmer facilement, sans avoir de compétences théoriques importantes. C’est un raisonnement que je me fais depuis longtemps à mon propre sujet : je passe une partie importante de mon temps de travail à écrire du code et pourtant, je n’ai jamais étudié l’informatique et je n’ai pas de connaissances approfondies en algorithmique. Un exemple parmi beaucoup d’autres : tout ce que j’ai pu apprendre sur les algorithmes de tri (que je n’ai appris que par curiosité et jamais par besoin) ne m’a jamais été directement utile, parce que toutes les fois où j’ai eu à trier des données, il était plus simple et plus efficace d’utiliser une fonction native ou fournie par une bibliothèque du langage que j’utilisais (le plus souvent python).

J’ai longtemps pensé que cette approche était caractéristique d’un autodidacte de la programmation, professeur de lettres de formation, mais j’ai constaté au contact de ‘vrais’ informaticiens, ou de stagiaires qui finissaient des études (de type BTS ou DUT) en programmation que beaucoup n’ont pas de notions théoriques plus approfondies et que ces connaissances ne sont guère utiles dans la pratique quotidienne de beaucoup de programmeurs.

Or l’âge du péta-octet exige une vraie réflexion sur les algorithmes : le volume gigantesque de données nécessite des traitements optimisés pour être réalisables dans des conditions acceptables, les opérations à mettre en oeuvre impliquent des notions sur les statistiques que tous ne possèdent pas. La conséquence de cela va être l’élargissement du fossé entre l’élite des programmeurs, très compétents, détenteurs de connaissances très pointues dans des disciplines scientifiques, et la piétaille des scripteurs, qui sera de moins en moins distincte des power users, de plus en plus nombreuse. Bien sûr, cette fracture existe déjà, mais il y a fort à parier qu’elle va aller en s’accentuant.

Transférer des mots de passe d’une base de données MySQL/PHP vers un annuaire LDAP

J’ai récemment voulu récupérer des mots de passe depuis une base de donnée MySQL (alimentée par PHP) pour les mettre dans un annuaire LDAP, et comme je n’ai pas trouvé immédiatement la solution à ce problème, je consigne ici la procédure que j’ai suivie, pour qu’elle puisse être utile à un autre (cet autre pouvant être celui que je serai dans un an ou deux).

Les données du problème

  • J’ai une base de données MySQL, associée à une application en PHP, Ilias Open Source, qui contient des mots de passe. Naturellement, ces mots de passe ne sont pas stockés en clair dans la base de données, ils sont hachés en utilisant MD5.
  • J’ai un annuaire openLDAP qui contient des données utilisateurs et notamment des mots de passe. LDAP n’est pas très exigent en ce qui concerne les mots de passe : il lui suffit que la chaîne correspondant au mot de passe commence par le nom de l’algorithme de hachage utilisé pour produire la chaîne qui suit. Bien sûr, il faut que l’algorithme choisi soit connu d’openLDAP (il est possible d’ajouter des modules à la compilation pour le faire fonctionner avec tous les algorithmes couramment utilisés pour hacher les mots de passe).
  • Je veux que les mots de passe des utilisateurs présents dans l’annuaire soient ceux qu’ils ont dans la base de données relationnelle.

Le problème

A première vue, il n’y a pas de problème : je prends le mot de passe haché dans ma base de données et je le mets dans l’annuaire en le faisant précéder de {MD5}. C’est d’ailleurs ce que j’ai essayé de faire tout d’abord et cela ne fonctionne pas.

En cherchant un peu, on trouve rapidement l’explication de cela et elle est assez simple : l’algorithme MD5 produit une empreinte sous la forme d’une séquence de 128 bits, soit 16 octets. Naturellement, une telle suite de 16 octets ne peut pas être représentée en texte “normal” (ascii), il faut donc lui faire subir un traitement pour pouvoir l’imprimer ou même simplement l’afficher sur un écran.

C’est là que le problème se pose : la fonction MD5 de php crée, par défaut, une représentation de cette séquence sous la forme d’une suite de 32 chiffres hexadécimaux (en Python un tel résultat est obtenu avec la fonction hexdigest() du module md5 (ce module est déconseillé dans les versions de Python supérieures à la 2.5, mais le programme que j’ai écrit était en Python 2.3) ), openLDAP (je suppose que c’est le fonctionnement standard de toutes les implémentations du protocole LDAP), en revanche, prend directement la séquence d’octets (équivalent de la fonction Python digest() du module md5) et l’encode en base64, un algorithme destiné à représenter des données binaires en texte, utilisé, par exemple, pour encoder les pièces jointes des messages électroniques.

La solution

Après beaucoup de tâtonnements et (trop) de recherches, j’ai réussi à trouver la formule qui me donne satisfaction. La voici (en Python) :

En supposant que pw_php est le mot de passe que j’ai obtenu de la base MySQL et pw_ldap le mot de passe que je vais inscrire dans l’annuaire LDAP.

pw_ldap = "{MD5}" + base64.encodestring(pw_php.decode("hex"))

La méthode decode() de l’objet chaîne, avec le paramètre “hex” décode l’empreinte encodée en caractères hexadécimaux, pour obtenir à nouveau la séquence de 16 octets. Cette séquence est alors encodée en base64 grâce à la fonction encodestring() du module base64. Comme je l’ai indiqué plus haut, le début de la chaîne de caractères du mot de passe indique l’algorithme utilisé pour hacher le mot de passe (ici MD5), entre accolades.

Blogged with Flock

Tags: , , ,

Cheatsheet Symfony

Créer un projet

– Créer répertoire

– Dans le répertoire, lancer :

symfony init-project nom_projet

– Dans ce répertoire, créer un fichier .htaccess :

php_value magic_quotes_gpc 0

– Donner au serveur apache la permission d’écrire dans le répertoire cache

– Il faut créer une application :

symfony init-app nom_app

– Création de la bdd

– Modifier fichier config/databases.yml en mettant les bonnes données pour la bdd :

dsn: mysql://symfony_user:symfony_password@localhost/symfony

et en enlevant les # en début de lignes.

– Modifier config/propel.ini

– Création du schéma de la base

symfony propel-build-schema

– Génération du modèle :

symfony propel-build-model

Faire en sorte que des noms signifiants apparaissent pour les objets correspondant à des clés externes

Il faut que la méthode toString() soit implémentée pour les classes concernées