A little over a year ago I discovered a Yubikey Replay Attack . The YubiKey is a hardware authentication token that looks like a small USB memory stick, but it is actually a keyboard. With the command of an integrated touch button, the device can send a time-variant, secure login code as if it was typed in from a keyboard. And because USB-keyboards are standard on all computers the YubiKey works on all platforms and browsers without the need for client software.
I believe the YubiKey is the answer to the biggest information security problem. PASSWORDS. If you can’t remember thousands of random letters and symbols in seconds (Read: Moonwalking with Einstein) you need a Yubikey.
Everyone should be using a Yubikey , LastPass and TrueCrypt.
I believe in the Trust No One (TNO) ideal of information security. However, with a Yubikey you are required to trust Yubico. So, If you can’t trust them, you should YubiKey – Trust But Verify (TBV).
Here is a simple script to verify Yubico has not slipped. About the only problem with Yubikey is the Replay Attack.
#!/usr/bin/perl #use strict; #use Yubico::Auth; use LWP::Simple; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $id = "1250"; # Your Yubikey ID here $logfile = "./usedkeys"; @otp_list = ""; $x = 0; open(LOG,">>$logfile") || die("Can't open $logfile\n"); printf LOG "\nNew TBV Yubikey test - "; printf LOG "%4d-%02d-%02d %02d:%02d:%02d\n\n", $year+1900,$mon+1,$mday,$hour,$min,$sec; print "Yubikey Replay test\n\n"; print "Type 'stop' to end input\n"; print "\nEnter your ID number: "; $id = <STDIN>; chop $id; do { $x=$x+1; print "\nPress Yubikey: "; # Ask for input $otp = <STDIN>; # Get input chop $otp; # Chop off newline if ($otp ne "stop") { $url = "http://api.yubico.com/wsapi/verify?id=".$id."&otp=".$otp; $req = get($url) || die("Request Error\n"); chop $req; print LOG "NEW ".$x. " ". $id. " ". $otp. "\n". $req. "\n"; print "NEW ".$x. " ". $id. " ". $otp. "\n". $req. "\n"; push(@otp_list, $otp); } $y = 0; foreach $reotp(@otp_list) { $url = "http://api.yubico.com/wsapi/verify?id=". $id ."&otp=". $reotp; $req = get($url); chop $req; if( $y > 0 ) { print LOG "USED ".$y. " ". $id. " ". $reotp. "\n". $req. "\n"; print "USED ".$y. " ". $id. " ". $reotp. "\n". $req. "\n"; } ; $y = $y+1; } close(LOG); } while ($otp ne "stop"); # Redo while wrong input print LOG "\n>>> Re-pay the keys\n\n";