# MultiOTP

multiOTP (One Time Password, « Mot de passe à usage unique ») est une classe PHP, un outil en ligne de commande et une console web pour fournir une solution d'authentification forte indépendante de tout système d'exploitation. multiOTP est certifié OATH depuis la version 4.1.0 et est développé sous licence LGPL par l'entreprise suisse SysCo systèmes de communication sa. Des déclinaisons commerciales appelées multiOTP Pro et multiOTP Enterprise sont également disponibles.
Un QRcode est généré automatiquement lors de l'impression de la page de configuration d'un utilisateur.

## Historique

* La version 1.0.0 du 7 juin 2010 ne fournissait qu'un outil rudimentaire en ligne de commande appelé otpauth, déjà écrit en PHP. L'outil a été renommé en multiotp en version 1.1.4 quelques jours plus tard afin d'éviter une confusion avec un autre projet portant le même nom.
* La version 2.0.0 du 19 juillet 2010 a été complètement réécrite sous la forme d'une classe PHP, l'outil en ligne de commande devenant ainsi une implémentation de la classe. Sous Windows, l'outil en ligne de commande existe sous la forme d'un fichier exécutable incluant en un seul fichier le code et l'interpréteur PHP.
* La version 3.0.0 du 2 septembre 2010 permet l'importation de fichiers de provisionnement au format PSKC non encodé et la structure de stockage interne est améliorée.
* La version 3.1.1 du 19 décembre 2010 permet le stockage des informations dans une base de données MySQL.
* La version 3.2.0 du 6 juillet 2011 permet de s'authentifier avec un compte générique en passant ensuite comme mot de passe le compte et le mot de passe de l'utilisateur spécifique (ceci dans le cas d'une liaison de la bibliothèque avec une authentification sous Windows nécessitant un utilisateur unique).
* La version 3.9.2 du 25 octobre 2011 est la version préparée pour un atelier concernant l'intégration de l'authentification forte dans les applications Internet. Cet atelier se déroulait dans le cadre de l'Application Security Forum - Western Switzerland 2011 à Yverdon-les-Bains (Suisse). La bibliothèque a également été utilisée pour valider et distribuer le seed des tokens distribués par le sponsor de la manifestation Feitian. Il suffisait à chaque participant de fournir une adresse email, un numéro de téléphone mobile, le numéro de série du token et le code OTP affiché sur le token, puis un email chiffré était envoyé au participant alors que le code de déchiffrage du mail était envoyé par SMS.
* La version 4.0.7 du 30 août 2013 apporte beaucoup d'améliorations, et notamment un fonctionnement en client/serveur avec un stockage local en cache des fichiers de définition des tokens utilisés, la refonte complète du support MySQL (incluant la création et la mise à jour des tables nécessaires), le support de l'authentification CHAP (en plus de l'authentification PAP), la génération de QRcode pour le provisionnement direct dans Google Authenticator, la création rapide d'un utilisateur en une seule commande, etc.
* La version 4.0.9 du 22 septembre 2013 est une version intermédiaire utilisée pour démontrer le concept de l'authentification forte lors de divers forum comme la Rump Session de l'Application Security Forum - Western Switzerland 2013 à Yverdon-les-Bains (Suisse) et la présentation de 45 minutes durant le Studerus Technology Forum (TEFO) 2013 à Zurich (Suisse).
* La version 4.1.0 du 23 décembre 2013 est certifiée OATH pour HOTP et TOTP, ce qui signifie une compatibilité totale avec tous les tokens hardware certifiés, y compris les fichiers de provisioning PSKC encryptés. Sa version beta a été utilisée durant la présentation de 30 minutes donnée dans le cadre de la conférence PasswordsCon 2013 à Bergen (Norvège). Toutes les instructions et les fichiers nécessaires à la mise en place d'un appareil d'authentification forte à base d'un nano-ordinateur Raspberry Pi sont inclus. Il est maintenant possible d'enregistrer automatiquement des tokens hardware non attribués, et il est également possible d'effectuer une resynchronisation ou un déblocage de token lors de l'authentification. Une interface web basique fait son apparition.
* La version 4.1.1 du 20 janvier 2014 apporte un lot de correctifs à la suite des retours des utilisateurs, et notamment un meilleur support de Microsoft Authenticator. Lors de la resynchronisation d'un token (en saisissant deux tokens consécutifs), il n'est plus nécessaire de fournir le PIN code.
* La version 4.2.0 du 7 février 2014 fournie le support des protocoles MS-CHAP et MS-CHAPv2.
* La version 4.2.1 du 14 février 2014 supporte une liaison Active Directory / LDAP afin de créés des comptes sur la base des utilisateurs Active Directory présents dans un groupe particulier.
* La version 4.2.2 du 3 mars 2014 propose une interface web améliorée permettant d'importer les fichiers de configuration de tokens hardware, de créer des utilisateurs, de resynchroniser des tokens, de débloquer des utilisateurs ou encore d'imprimer la feuille de provisionnement du token (avec impression d'un QRcode pour les tokens de types TOTP et HOTP). Un support étendu du serveur RADIUS TekRADIUS a été ajouté afin de pouvoir lui retourner des informations particulières, ce qui est notamment utile lors d'une connexion MS-CHAP ou MS-CHAPv2.
* La version 4.2.3 du 13 mars 2014 corrige une erreur concernant un possible mauvais retour d'information au serveur TekRADIUS si multiOTP est utilisé afin de négocier une clé de chiffrement pour établir une liaison sécurisée.
* La version 4.2.4 du 30 mars 2014 améliore la prise en charge de MySQL et supporte à présent également la classe mysqli. Il est également possible de choisir sans modification dans le code source les champs à encrypter dans la base de stockage. La génération du QRcode a été améliorée, de nombreux tests de qualités ont été ajoutés et la documentation a été mise à jour.
* La version 4.2.4.1 du 6 avril 2014 ajoute la génération et la sortie sur le flux standard de la clé NT_KEY afin de pouvoir négocier des clés de chiffrage en utilisant FreeRADIUS. Il est maintenant possible d'importer des définitions de tokens stockées dans un fichier plat de type CSV. Un utilisateur effacé est à présent également retiré du token attribué à cet utilisateur. L'option en ligne de commande -user-info a été ajoutée afin d'avoir des informations détaillées concernant un utilisateur spécifique.
* La version 4.2.4.2 du 13 avril 2014 améliore la gestion de XML dans la totalité du projet en utilisant plus qu'une seule bibliothèque identique. Une erreur pouvant se produire lors de l'importation de définitions de tokens dans un fichier CSV a été corrigée.
* La version 4.2.4.3 du 12 juin 2014 corrige une erreur concernant le fournisseur de SMS aspsms.
* La version 4.3.0.0 du 4 novembre 2014 ajoute la possibilité d'utiliser un mot de passe AD/LDAP à la place d'un PIN statique. Cette version ajoute également le support du protocole Yubico OTP, y compris l'importation des clés en utilisant le fichier de log fourni par l'utilitaire de personnalisation de Yubico. La synchronisation des utilisateurs en AD/LDAP a été complètement revue. Cette version a été utilisée le 4 novembre 2014 pour le workshop d'une journée présentée à l'Application Security Forum - Western Switzerland 2014 d'Yverdon-les-Bains (Suisse).
* La version 4.3.1.0 du 9 décembre 2014 ajoute un proxy spécifique à la version CLI, permettant d'augmenter significativement la vitesse de traitement avec une implémentation réalisée sur un Raspberry Pi. Le support générique LDAP a été ajouté (pour les disques réseau Synology ainsi que tout autre implémentation basée sur Linux). Les OTP incluant un numéro de série sont également mieux supportés (en PAP). Dès cette version et si l'option est activée, le code PIN en préfixe est également nécessaire en utilisant les mots de passe à biffer. La variable d'environnement MULTIOTP_PATH est dorénavant supportée et elle permet de définir le dossier principal de multiotp (si une implémnentation spéciale fait que ce répertoire ne se retrouve pas automatiquement).
* La version 4.3.1.1 du 15 décembre 2014 fournit des améliorations dans la synchronisation AD et LDAP, en prenant en compte plus de champs. Le projet multiOTP est à présent également disponible sur GitHub.
* La version 4.3.2.2 du 9 juin 2015 améliore certaines parties anciennes, ajoute/adapte certaines valeurs par défaut, autorise l'utilisation d'un moins (-) dans le mot de passe, active par défaut les options autoresync et le cache, implémente directement dans la classe la resynchronisation et nettoie les informations du fichier de log.
* La version 4.3.2.3 du 10 juin 2015 est la version qui a été présentée durant le Dev(Talks): 2015 de Bucharest (Roumanie). Cette version contient des améliorations au niveau de l'interface web.
* La version 4.3.2.4 du 24 juin 2015 corrige une erreur si l'usage de caractères spéciaux est faite lors de la génération des mots de passe à biffer. La synchronisation AD/LDAP permet à présent de définir automatiquement un compte comme étant de type multi_account.
* La version 4.3.2.5 du 15 juillet 2015 change le comportement de la version en ligne de commande quand celle-ci est appelée sans paramètre. Un code d'erreur (30) est retourné au lieu d'un code d'information (19). Des fichiers permettant une utilisation en tant qu'applicatif virtuel sont maintenant fournis, que ce soit au format standard OVA, avec les améliorations open-vm-tools, ou encore au format Hyper-V.
* La version 4.3.2.6 du 18 juillet 2015 ajoute la génération d'un QRcode pour les codes de type mOTP (Mobile-OTP), et une nouvelle méthode est à présent implémentée pour charger dans un tableau les données concernant un utilisateur spécifique.
* La version 5.0.2.5 du 16 octobre 2016 propose un meilleur support du SSL, la possibilité de choisir l'attribut AD/LDAP utilisé pour synchronisé les comptes, un meilleur support de MS-CHAPv2, une meilleure gestion de la répétition du même mot de passe (lors de l'utilisation de multiOTP pour du VPN par exemple), l'ID privé de YubicoOTP est maintenant contrôlé, la synchronisation AD/LDAP en SSL est désormais compatible avec Windows 2012R2, les caractères spéciaux AD/LDAP (RFC4515) sont mieux supportés, de nouvelles méthodes existent afin d'implémenter des activités asynchrones lors du changement de données stockées.
* La version 5.0.2.6 du 4 novembre 2016 améliore les messages de log, met à jour quelques utilitaires externes et adapte le format du fichier de sauvegarde afin qu'il soit compatible avec la version commerciale.
* La version 5.0.3.0 du 14 novembre 2016 ajoute le support de l'adresse IP de Dial-In (y compris sa synchronisation avec l'attribut Active Directory msRADIUSFramedIPAddress) et améliore l'importation de tokens en supportant des clés de cryptage binaire.
* La version 5.0.3.4 du 26 janvier 2017 a amélioré le processus de synchronisation AD/LDAP pour les grands annuaires AD/LDAP en activant par défaut le cache dans le dossier temporaire du système. Plusieurs commandes CLI peuvent maintenant être effectuées en une seule ligne. Plusieurs groupes d'utilisateurs sont désormais pris en charge (avertissement, tous les périphériques ne prennent pas en charge plusieurs groupes). Le générateur de TOTP/HOTP proposé par défaut est maintenant FreeOTP (pour Android/iOS). Le format de provisionnement de jetons à usages multiples PSKCV10 est maintenant pris en charge.
* La version 5.0.3.5 du 3 février 2017 a corrigé quelques bugs et ajouté la méthode GetUserInfo.
* La version 5.0.3.6 du 21 février 2017 ajoute le support de binaire brut et de base32 pour les méthodes SetUserTokenSeed et SetTokenSeed. La méthode de restauration de la configuration a été mis à jour.
* La version 5.0.3.7 du 23 février 2017 a ajouté quelques améliorations mineures telles que le nettoyage des noms de groupe (trim) et la gestion du mode de dossier Linux.
* La version 5.0.4.4 du 16 mai 2017 a amélioré la politique de rejet en n'incrémentant pas le compteur d'erreurs pour le même jeton ré-exécuté.
* La version 5.0.4.5 du 29 mai 2017 a ajouté le support PostgreSQL, basé sur le code source fourni par Frank van der Aa.
* La version 5.0.4.6 du 2 juin 2017 a redéfini sous Linux l'emplacement de la configuration des dossiers de configuration, des périphériques, des groupes, des jetons et des utilisateurs dans /etc/multiotp /
* La version 5.0.4.8 du 6 juin 2017 corrige la connexion échouée avec LDAP SSL/TLS pour PHP 7.x
* La version 5.0.4.9 du 7 juillet 2017 a corrigé quelques bugs mineurs et a ajouté des méthodes de configuration pour la connexion TLS.
* La version 5.0.5.0 du 8 septembre 2017 a supprimé l'utilisation de l'outil nircmd.exe en raison d'un faux-positif lors de la détection de virus.
* La version 5.0.5.2 du 29 septembre 2017 a défini le générateur de mOTP par défaut pour Android/iOS comme étant OTP Authenticator
* La version 5.0.5.6 du 4 novembre 2017 a amélioré la documentation de l'utilisation avec FreeRADIUS 3.x et a corrigé quelques bugs mineurs.
* La version 5.1.0.3 du 19 février 2018 a ajouté la prise en charge du mot de passe AD/LDAP expiré et une meilleure gestion unicode. Certaines améliorations pour le fournisseur d'informations d'identification multiOTP (pour Windows) ont également été apportées.
* La version 5.1.0.8 du 5 mars 2018 a amélioré le multiOTP Credential Provider et il est désormais possible d'utiliser des entrées de registre. Il corrige également le lien « recevoir un OTP par SMS » pour Windows 10.
* La version 5.1.1.2 du 20 mars 2018 a fourni le premier fichier Docker permettant de créer un container contenant un serveur multiOTP open source complet.
* La version 5.2.0.2 du 16 juillet 2018 a amélioré la prise en charge du protocole AD/LDAP pour Active Directory, et ajout de l'option « Users DN » (facultative, sinon le « Base DN » est toujours utilisé pour la recherche d'utilisateurs)
* La version 5.3.0.0 du 21 août 2018 a ajouté le support de plusieurs « Users DN » (séparés par un point-virgule) pour la synchronisation AD/LDAP (avec des messages de débogage de synchronisation supplémentaires) et le nouvel algorithme « without2FA », ceci si certains utilisateurs ne souhaitent que le mot de passe/préfixe sans jeton.
* La version 5.3.0.1 du 22 août 2018 a ajouté des informations sur le processus de synchronisation.
* La version 5.3.0.3 du 26 août 2018 a corrigé le processus de restauration dans l'outil en ligne de commande et amélioré le processus client/serveur.
* La version 5.4.0.1 du 14 septembre 2018 a corrigé le mode de compatibilité du composant serveur Windows Radius lors de l'installation.
* La version 5.4.0.2 du 13 novembre 2018 a amélioré l'importation de fichier PSKC avec clé de décodage binaire et a ajouté la prise en charge de plusieurs fournisseurs de SMS (Swisscom LA REST, Afilnet, Clickatell2, eCall, Nexmo, NowSMS, SMSEagle et fournisseur SMS)
* La version 5.4.1.1 du 7 janvier 2019 a ajouté le support des Raspberry Pi 3B+.
* La version 5.4.1.4 du 18 janvier 2019 a ajouté le support Debian 9.x (stretch).
* La version 5.4.1.6 du 25 janvier 2019 a corrigé un problème d'option DHCP NTP.
* La version 5.4.1.7 du 30 janvier 2019 modifie la bibliothèque de génération de QRcode et fourni une nouvelle image binaire Raspberry Pi prête à être utilisée pour les Raspberry Pi 1B/1B+/2B/3B/3B+.
* La version 5.4.1.8 du 29 mars 2019 a ajouté le support de l'Access-Challenge
* La version 5.8.0.2 du 20 septembre 2020 a ajouté la définition de provider SMS web génériques, l'effacement automatique des comptes inexistants dans AD/LDAP et le support pour Debian Buster 10.5, PHP 7.3 et Raspberry PI 4B
* La version 5.8.1.0 de 12 février 2021 a amélioré l'affichage de l'état des comptes sur l'interface web

## Fonctionnement

Le cœur de multiOTP est une classe PHP. Elle peut donc être instanciée dans n'importe quelle application PHP, ce pour autant que l'on utilise une version de PHP supérieure ou égale à la version 5.3.0 (jusqu'en version 4.2.4.2, la bibliothèque fonctionne toujours avec une installation de PHP en version 4.4.4 ou supérieure, mais sans garantie).
La bibliothèque multiOTP est fournie sous la forme d'un seul fichier à inclure regroupant tout le code PHP nécessaire, ce qui évite tout problème de liens relatifs ou absolus par rapport à d'autres fichiers qu'il faudrait inclure. Les codes sources séparés sont toutefois également disponibles dans le fichier compressé du projet et sur la plateforme GitHub.
Si l'authentification forte se fait non pas depuis une application Internet, mais depuis un appareil en réseau, on passera alors par un serveur RADIUS qui appellera l'outil en ligne de commande fourni avec la bibliothèque multiOTP.

### Description générale

Pour les projets sous Windows, la bibliothèque multiOTP est fournie avec un serveur RADIUS préconfiguré (freeRADIUS) pouvant être installé en service ainsi qu'avec un serveur web préconfiguré (mongoose) pouvant également être installé en service. Le service web fournit la partie serveur lorsque l'on veut utiliser multiOTP en configuration client/serveur.
Pour les projets sous Linux, le fichier readme.txt fourni avec la bibliothèque indique ce qu'il est nécessaire de faire afin de configurer le serveur RADIUS et le service Web.
L'authentification d'un client sur une application ou un appareil nécessitant une authentification forte peut se faire de différentes manières:
* clé logicielle (par exemple en utilisant le logiciel Google Authenticator)
* clé matérielle (par exemple une clé de type Feitian C200 pour un code dépendant du temps)
* code envoyé par SMS (depuis la version 4.0.4)
* liste de mots de passe à biffer (depuis la version 4.0.4)

### Standardisation et normalisation

multiOTP est certifié OARH pour HOTP et TOTP et implémente les standards suivants concernant l'authentification forte :
* HOTP, HMAC-Based One-Time Password Algorithm (RFC4226)
* TOTP, Time-Based One-Time Password Algorithm (RFC6238)
* Yubico OTP
* mOTP, Mobile-OTP, strong, two-factor authentication with mobile phones
* Google Authenticator (OATH/HOTP or OATH/TOTP, base32 seed, QRcode provisioning)
* SMS tokens (using aspsms, clickatell, intellisms, or even your own script)
* PSKC (Additional Portable Symmetric Key Container Algorithm Profiles) (RFC6030)
* CHAP (Challenge Handshake Authentication Protocol) (RFC1994)
* MS-CHAP (Microsoft PPP CHAP Extensions) (RFC2433)
* MS-CHAPv2 (Microsoft PPP CHAP Extensions, Version 2) (RFC2759)
* Syslog Protocol (client) (RFC5424)
* SMTP (Simple Mail Transfer Protocol) (RFC2821)
* SMTP Service Extension for Secure SMTP over TLS (RFC2487)
* Lightweight Directory Access Protocol (LDAP) (RFC4511)
* String Representation of Search Filters in LDAP (RFC4515)

### Applications pratiques

multiOTP permet notamment :
* d'ajouter de l'authentification forte pour l'identification d'un utilisateur (évite ainsi la connexion avec un mot de passe volé ou deviné).
* en fixant une clé matérielle à un endroit particulier, de s'assurer la présence d'une personne à cet endroit à un moment précis (le code fourni par la personne à un moment donné permettant de connaître l'heure à laquelle ce code a été affiché).
* d'authentifier un utilisateur en lui envoyant un code par SMS, validant ainsi automatiquement l'utilisateur par rapport à son numéro de téléphone mobile.
* de créer automatiquement des comptes d'authentifications fortes pour les utilisateurs d'un Active Directory (ou d'un LDAP) présents dans un groupe spécifique.

### Apports et limitations

Le fait que multiOTP soit disponible en tant que bibliothèque PHP permet de l'installer partout, y compris sur un serveur web mutualisé.
L'implémentation est suffisamment légère pour tourner sans problème sur des nano-ordinateurs comme le Raspberry Pi. Le fichier readme fourni avec le fichier compressé indique toutes les étapes pour réaliser l'implémentation de multiOTP sur ce dernier.

## Aspects économiques et sociaux

Les mots de passe traditionnels sont encore bien présents dans les environnements informatiques actuels, mais c'est le principal talon d'Achille de l'authentification en général. En effet, on l'a vu encore récemment avec les dernières failles de sécurité, et notamment avec Heartbleed, un simple mot de passe ne suffit plus, même s'il est envoyé via un canal réputé sûr!
En fournissant une solution simple, légère et gratuite d'authentification forte, multiOTP permet de démocratiser l'utilisation de l'authentification forte. Depuis sa version 4.1.0, il est même possible de mettre en place facilement un appareil autonome d'authentification forte pour moins de $100 en matériel, ou simplement en recyclant une vieille machine Linux.

## Exemples d'utilisation de la librairie

* Depuis novembre 2016, l'équipe multiOTP fournit un Credential Provider pour Windows 7/8/8.1/10/2012(R2)/2016, avec différentes options comme une authentification forte uniquement lors de connexion RDP ou la prise en charge du nom UPN. Ce logiciel s'appelle multiOTP Credential Provider, basé sur MultiOneTimePassword Credential Provider créé par Last Squirrel IT.
* ownCloud OTP est une application de mot de passe à utilisation unique basée sur la classe multiOTP qui ajoute une authentification forte au projet OwnCloud, une alternative Open Source à DropBox.
* 2FA Credential Provider for Windows Credential Provider pour Windows basée sur la librairie multiOTP.
* La classe multiOTP a été utilisée comme outil d'apprentissage dans des démonstrations de sécurité. ou encore pour une thèse de Bachelor