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实现这样一个算法,就可以和手机进行两步验证了。
更安全了有木有。