Openstuff Wiki : OTP

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

Revision [551]

This is an old revision of OTP made by StanKju on 2007-12-05 13:28:26.
 
Mise en place d'OTP

Principe


One Time Password (OTP) est un système qui permet d'utiliser des mots de passe différent à chaque nouvelle connexion. Voici comment cela fonctionne:

Ceci implique donc un secret partagé entre le serveur et le client. L'avantage de ce système et qu'il est insensible au rejeu: si une personne intercepte le résultat, il ne pourra pas l'utiliser, ce dernier étant valide qu'une seule fois. Par contre, il est toujours possible pour l'attaquant de brute forcer le mot de passe si celui-ci intercepte à la fois le challenge et le résultat.

Pour terminer, on estime OTP comme étant un système à deux facteur d'authentification (two-factor authentication). Il se base sur quelque chose que l'on connait (le password) et quelque chose que l'on possède (le logiciel ou le composant physique).

Pour plus d'information sur OTP, se référer à http://www.deer-run.com/~hal/ns2000/otp.pdf

Installation des outils


Serveur:
# apt-get install opie-server


Client:
$ sudo apt-get install opie-client 


Initialisation des mots de passe


Serveur:
# opiepasswd jstankiewicz -n 99
Updating jstankiewicz:
You need the response from an OTP generator.
New secret pass phrase:
	    otp-md5 99 te6984
	    Response: 

L'option -n définit le nombre de login autorisé avant que le secret ne doit être réinitialisé.


Client:
opiekey 99 te6984
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: 
AHEM ATOM SALE ARC LAP WIFE


Server:
	    Response: AHEM ATOM SALE ARC LAP WIFE

ID jstankiewicz OTP key is 99 te6984
AHEM ATOM SALE ARC LAP WIFE


Vérification


Le fichier opiekeys sur le serveur contient les informations sur les utilisateurs permettant d'authentifier ceux-ci:
# cat /etc/opiekeys 
jstankiewicz 0099 te6984           4989df57818233f7  Dec 05,2007 13:29:33

Voici l'explication des différents champs:

Pour information, la commande opieinfo permet d'extraire le numéro de séquence ainsi que la graine pour les futurs challenge:
# opieinfo jstankiewicz
98 te6984


http://search.cpan.org/%7Eeestabroo/Authen-OPIE-1.00/OPIE.pm
# apt-get install libopie-dev
# wget "http://search.cpan.org/CPAN/authors/id/E/EE/EESTABROO/Authen-OPIE-1.00.tar.gz"
# tar zxvf Authen-OPIE-1.00.tar.gz
Authen-OPIE-1.00/
Authen-OPIE-1.00/OPIE.xs
Authen-OPIE-1.00/Makefile.PL
Authen-OPIE-1.00/Changes
Authen-OPIE-1.00/OPIE.pm
Authen-OPIE-1.00/MANIFEST
Authen-OPIE-1.00/test.pl
# cd Authen-OPIE-1.00/
# perl Makefile.PL 
Writing Makefile for Authen::OPIE
# make
[...]
Manifying blib/man3/Authen::OPIE.3pm
# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl
1..1
OPIE must be set up on your box in order for this test to work
You must be root in order to use the OPIE module (as root is the only one with permissions on the opiekey file)
ok 1
Login to test: jstankiewicz
I challenge you [jstankiewicz]: otp-md5 98 te6984 ext
your response? NAT WAIL BRIM WING WIFE CAP
ok 3: response was verified (you passed)
# make install
[...]


Client:
$ opiekey 98 te6984
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: 
NAT WAIL BRIM WING WIFE CAP


#!/usr/bin/perl -w

use strict;
use Authen::OPIE qw(opie_challenge opie_verify);

# Get user name
print "user:";
my $user= <STDIN>;
chomp($user);

# Create a challenge
my $opiechalstr = opie_challenge($user);
die "Unknown OPIE user: $user" if (not defined $opiechalstr);

my @opiechalarr=split(/ /, $opiechalstr);
die "Unknown challenge type: $opiechalstr" if ($opiechalarr[0] ne "otp-md5");

print "sequence: ",$opiechalarr[1],"\n";
print "seed: ",$opiechalarr[2],"\n";

# Verify the challenge
print "response:";
my $response = <STDIN>;
chomp($response);

print "Empty response" if (not defined $response or $response eq "");
my $verifyval = opie_verify($user,$response);

if (not defined $verifyval or $verifyval != 0) {
        die "Authentication FAILED";
}
else {
        print "Authentication SUCCEEDED\n";
}

exit 0;


./opie_server.pl 
user:jstankiewicz
Unknown OPIE user: jstankiewicz
testsecu2:~# vi ./opie_server.pl 
testsecu2:~# ./opie_server.pl 
user:jstankiewicz
sequence: 97
seed: te6984
response:ROAR JEAN MUFF LYON HIDE BARK
Authentication SUCCEEDED
testsecu2:~# ./opie_server.pl 
user:jstankiewicz
sequence: 96
seed: te6984
response:ROAR JEAN MUFF LYON HIDE BARK
Authentication FAILED at ./opie_server.pl line 30, <STDIN> line 2.
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0845 seconds