W3C home > Mailing lists > Public > public-rww@w3.org > August 2012

Time-based One Time Passwords

From: Melvin Carvalho <melvincarvalho@gmail.com>
Date: Tue, 28 Aug 2012 12:43:39 +0200
Message-ID: <CAKaEYhJ8uM2d2VK8DPXobp_P1J-A6rOv+x2Sp9OnFyFGFptgjA@mail.gmail.com>
To: public-webid <public-webid@w3.org>, public-rww <public-rww@w3.org>
Could be quite useful, topic has come up a few times ...

http://chmod777self.blogspot.de/2012/08/dropbox-and-time-based-one-time.html

The news that Dropbox had enabled Two-factor authentication was very
welcome. What's even cooler is that they did so using the same basic
mechanism that Google uses for their stuff. Standards are Good:
http://tools.ietf.org/html/rfc6238

 What you may not know is that working with Time-based One-Time Passwords
is actually quite simple. As long as you can get the private key,
generating the OTP is pretty straight forward... consider:

 int len = Math.max(1, Math.min(9, size));
 byte[] h = hmac(getMovingFactor());
 int o = h[h.length - 1] & 0xf;
 return
   pad(
     Integer.toString(
       (((h[o] & 0x7f) << 24) |
       ((h[o + 1] & 0xff) << 16) |
       ((h[o + 2] & 0xff) << 8) |
       (h[o + 3] & 0xff))
         % (int)Math.pow(10, len)),
     len,'0');

 Here we see all the basic necessary steps for generating a TOTP of any
length up to 9-digits. These are pretty straight forward...

   1. Determine the length of the generated TOTP
   2. Determine the current "Moving Factor".. in this case, the current
   time-bracket for which the One-time password is being generated.
   3. Generate an HMAC from that Moving Factor using the Secret Key.
   4. Generating a Truncated Hash from the HMAC
   5. Converting the TH to a String and padding the front with zeroes if
   necessary to ensure that it's the right length.

 For step 1, the Google Authenticator application (and corresponding Linux
PAM Authenticator Module <http://goo.gl/pZTTj>) use a 6-digit TOTP.. so
that's out of the way...

 For step 2, Google Authenticator uses a 30-second time window.. so our
Moving Factor will be generated using the code...  where step = 30.

 protected byte[] getMovingFactor() {
   return toByteArray(
    (System.currentTimeMillis() / 1000l) / step);
 }

 Simple enough. Next, using the Secret Code provided by the authentication
provider, Google Authenticator generates an HmacSHA1 signature over the
moving factor. That signature is converted into an integer and mod'd
against 10^6 (10 to the power of the length of the generated OTP).

 The Secret Code provided by Google and Dropbox is a Base32-encoded string,
so in order to generate the hmac properly, you'll have to decode that into
a byte array but that's easy enough to do. Given that key (which you can
extract from the QRCode using a basic Bar Code Scanner app on your Android
or iOS device), so long as your system clock is in sync with the server,
you can generate the TOTP on your own without having the Google
Authenticator client application.

 Nice that something so simple can make such a big difference in online
security.  Would be excellent to see more services adopting TOTP's.
Received on Tuesday, 28 August 2012 10:44:08 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 28 August 2012 10:44:09 GMT