DEAD MAN CODING

FOOOLING.COM

说说Google authenticator这玩意

Aug. 23, 2014, 6:38 p.m.

如果你用过“支付宝钱包”里面的那个“手机宝令”,就应该对这玩意的形式不陌生。

Google authenticator(https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)

好吧中文名叫“身份验证器”

目前支持两种模式:


1. 基于时间,TOTP 
2. 基于计数器,HOTP


而我们熟悉的这种方式就是基于时间,离线地根据一个时间戳和秘钥来生成一个6位数密码。

基于时间的TOTP可以简单认为是基于计数器的,将时间戳简单除以30并取整再丢给HOTP就可以了。

即 TOTP(timestamp) == HOTP((int)(timestamp/30))


也给出一个python的实现


import hmac
import struct
import hashlib
import time
import base64


def hotp(secret, number):
    key = base64.b32decode(secret, True)
    # big-endian, long long
    msg = struct.pack(">Q", number)
    #RFC 2104 , HMAC algorithm
    digest = hmac.new(key, msg, hashlib.sha1).digest()
    offset = ord(digest[19]) & 15
    token_base = digest[offset:offset + 4]
    token = (struct.unpack(">I", token_base)[0] & 0x7fffffff) % 1000000
    return token


def totp(secret):
    return hotp(secret, number=int(time.time()) // 30)


mysecret = "thisismysecret"
mysecret = base64.b32encode(mysecret)
print "secret:",mysecret
print "token:",totp(mysecret)

在手机上安装Google authenticator,设置好你的secret之后就可以获得token啦!

只要在server实现这样一个算法,就可以和手机进行两步验证了。

更安全了有木有。

友情链接