L'OTP peut être utile pour sécuriser les formulaires de connexion. Le principe est d'ajouter un champ "OTP" aux formulaires de login. Donc 3 champs: Login, mot de passe et OTP.
Cette valeur OTP est différente à chaque fois, et calculée par une application sur votre téléphone (FreeOTP).
C'est ce qu'on appelle une authentification à double facteur. Pour se connecter, il faut deux facteurs: Ce que je *sais* (mot de passe) et ce que je *possède* (générateur OTP, qui se trouve être votre téléphone).
Ainsi si quelqu'un veut se connecter sur votre compte, il faudra qu'il vous vole votre mot de passe *ET* votre téléphone. Le vol de votre mot de passe peut passer inaperçu, mais il y a plus de chances que vous vous aperceviez du vol de votre téléphone :-)
(La valeur OTP change tout le temps et n'est donc pas réutilisable. Ce n'est pas grave si vous vous la faite voler "sur le réseau". L'important est d'avoir de quoi en générer de nouvelles.)
Il existe deux type d'OTP:
- TOTP : La valeur OTP est dépendante de la date et l'heure. La valeur change (par défaut) toutes les 30 secondes (mais c'est configurable).
- HOTP : La valeur OTP change à chaque utilisation (c'est un compteur).
HOTP a l'inconvénient, si le compteur est désynchronisé entre le serveur et votre application OTP, de nécessiter une réinitialisation.
Pour TOTP, il suffit juste que votre serveur et votre générateur OTP (donc votre téléphone Android) soient à la même heure.
Il est assez facile d'intégrer ça à vos applications php avec cette lib:
https://github.com/lelag/otphp
(Elle est simple à utiliser et pleinement compatible avec FreeOTP).
N'oubliez pas que votre "secret" (partagé entre le serveur et votre téléphone) doit être en base32 (c'est à dire A-Z 2-7).
Astuce: pour générer une valeur base32 valide, utilisez FreeOTP: Le bouton "Add" sera grisé tant que le secret n'est pas une valeur base32 valide.
Avec la lib otphp, si vous voulez changer le délai d'expiration du TOTP, il faut ajouter le paramètre "interval":
$totp = new \OTPHP\TOTP("MONSECRETAAAAAAA",array('interval'=>120)); // 120 secondes = 2 minutes
EDIT: Voir l'article sur mon wiki, avec des exemples:
http://sebsauvage.net/wiki/doku.php?id=totp