Google Authenticator

现在越来越多的网站采用两步验证,实现方式可能有所区别,一般来说是 1+? (1 即 普通的用户名和密码, ?可能是实物如U盾、手机短信验证码或其他)。?的重点是它是一次性的(One-Time Password OTP, 即动态密码). RFC提出了针对OTP的RFC4226, 后对其进行扩展形成了RFC6328协议(增加了 HMAC-based One-Time Password (HOTP)).

Google Authenticator就是基于RFC6328的实现, 该标准名称为 Open Authentication (OATH), 与OAuth没关系.

Google Authenticator APP支持Android, iOS, BlackBerry (WindowPhone不清楚).

APP 在线 Demo:

https://daplie.github.io/browser-authenticator/ (该Demo使用Google chat服务生成二维码图片, 中国可能无法显示二维码图片)

APP & HOTP

Use steps

  1. 用户在手机上安装Google Authenticator APP
  2. 用户认证的网站提供一个二维码(即一个URL信息), 让用户扫描添加该账号
  3. 用户登录后即可输入该APP上显示的动态密码,网站验证该动态密码

    APP生成动态密码 是独立进行的,无需联网. 网站验证过程也是独立的

二维码或URL的格式(内容)

关键是secret,其他都是一些提示信息

otpauth://TYPE/issuer:user?PARAMETERS

TYPE: hotp or totp
issuer: 发行方 <和后面的参数一致>
user: 用户账号
Parameters:
secret: 密钥
issuer: 发行方
其他可选参数, 以及各个细节内容 参见下面Google连接 该URL可以将其生成一个二维码, 用户通过APP扫描输入, 也可以手动输入user和secret 例如:
otpauth://totp/xiaowei:xiaowei@gmail.com?secret=UNYFYWFE7IN6MOAW&issuer=xiaowei

Algorithm

下面的代码采用 python3 描述

0. 生成URL上的secret

    # 首先选择一个原始密钥 key, 长度在
# 然后使用base32进行编码即可, 可以省略padding符(即后面的=)
# 由于base32结果以%8对齐, 我们也可以截取编码后的8n个长度的字符作为secret

1. 生成动态密码

    # 参数:  secret, input = None
# 通过 secret 得到 原始密钥 key
key = b32decode(secret) # 需要对padding符进行处理
if input == None:
input = int(time.time()) // 30 # input 为次数, 30为默认密码刷新间隔值
# 然后使用 HMAC-SHA1算法计算hash
hsh = hmac.new(key, input, hashlib.sha1).digest()
# 将hsh转换成数字(默认为6位)
i = hsh[-1] & 0xf # 以最后一个字节的后4个bits为数字,作为接下来的索引
f = hsh[i:i+4] # 以i为索引, 取hsh中的4个字节
n = struct.unpack('>I', f)[0] & 0x7fffffff# 将4个字节按big-endian转换为无符号整数, 转换时去掉最高位的符号位
# 等价于 n = ((f[0] & 0x7f) << 24) | ((f[1] & 0xff) << 16) | ((f[2] & 0xff) << 8) | (f[3] & 0xff)
# 将 n % 1000000 得到6位数字, 不足补零
r = '%06d' % (n % 1000000) # r 即为 生成的动态密码

2. 校验动态密码

    # 参数:  secret, n, window=1
# window为时间窗口, 也就是动态密码有效的时间期限 cur_input = int(time.time()) // 30
for i in range(cur_input-(window-1)//2, cur_input + window//2 + 1): # [cur_input-(window-1)//2, cur_input + window//2]
d = generate_dynamic_code(secret, i)
if d == n:
return True
return False

3. 备注

调试时,可以使用online qrcode将URL转换为二维码

Ref:

Github上一个python2实现: rentshare

Google开源的Authenticator:Google

协议:rfc6328

CSDN上的一个中文原理描述:csdn

Google Authenticator的更多相关文章

  1. 谷歌验证 (Google Authenticator) 的实现原理是什么?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:徐小花链接:http://www.zhihu.com/question/20462696/answer/18731073来源: ...

  2. How to Make LastPass Even More Secure with Google Authenticator

    Google Authenticator LastPass supports Google Authenticator, which is officially available as an app ...

  3. 为效率而生:开源Mac版Google Authenticator认证客户端GoldenPassport

    最近运维同学为了提高安全性,用Google Authenticator对服务器加了双重认证,此后登录服务器需要先输入动态密码,在输入服务器密码.Google Authenticator相当于软toke ...

  4. Google Authenticator 如何集成(U盾的实现原理相同)

    Google Authenticator是一个类似U盾的二次验证工具,Google提供了它的开源客户端(https://github.com/google/google-authenticator)里 ...

  5. java实现谷歌二步验证 (Google Authenticator)

    准备: 一个谷歌二步验证APP,  我用的是ios 身份宝 资料: 1.Google Authenticator 原理及Java实现   //主要参考 https://blog.csdn.net/li ...

  6. SSH + Google Authenticator 安全加固

    1. SSH连接 Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境.SSH通过在网络中创建安全隧道来实现SSH客户端与服务器 ...

  7. 【Linux】使用Google Authenticator 实现ssh登录双因素认证

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  8. 黄聪:谷歌验证 (Google Authenticator) 的实现原理是什么?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:徐小花链接:http://www.zhihu.com/question/20462696/answer/18731073来源: ...

  9. Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

随机推荐

  1. 破解版windows 7(旗舰版)下安装并使用vagrant统一开发环境

    参考百度经验:http://jingyan.baidu.com/article/5553fa82c158bb65a23934be.html,事先对win7进行破解后的三个文件进行还原,否则会导致vir ...

  2. 利用linux漏洞进行提权

    RHEL5—RHEL6下都可以提权 本人测试环境CenOS6.5:该方法只能用作与有root用户切换到普通用户的环境,如果是普通用户直接登录在执行最后一步的时候直接退出登录 $ mkdir /tmp/ ...

  3. java读取properties文件工具

    public class PropertiesUtil { public static String get(String filePath, String key) { String val = n ...

  4. maven clean deploy -Pproduction

    今天我修改了公司的组件,要发布.然后腾飞告诉我用这个命令:clean deploy -Pproduction发布. 然后报了个401错误.(当时还是不知道401是什么错)正好经理在旁边问了一下,没想到 ...

  5. 王爽 <<汇编 语言>> 13.6 BIOS中断例程应用

    ;名称:ILOVEU程序 ;使用BIOS提供的中断例程 assume cs:code code segment main: ;显示背景22*80 ;dh中放行号 ;dl中放列号 bibi: push ...

  6. linux下jdk的安装(tar包)

    1.查看jdk安装路径 [root@localhost ~]# whereis javajava: /usr/bin/java /etc/java /usr/lib/java /usr/share/j ...

  7. word使用技巧-批量删除图片技巧

    通过查找替换方法:ctrl+h,查找输入^g,替换输入空,然后替换即可. 今天看到一同事写的文档,发现里面很多word基础功能都不会用,比如同一级的标题居然有好几个样式,并且会级别搞错:列表里的数字居 ...

  8. [zhuan] linux 下 wxWidgets 安装,编译

      http://blog.csdn.net/yuzhenxiong0823/article/details/7727133 wxWidgets在Linux下有wxGTK和wxX11供使用,各需要GT ...

  9. C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 “枪与玫瑰” 我送走了“蝶恋花”,犹有一种身在梦中的感觉,昨晚的宿醉让我只觉得头晕乎乎的很不舒服,想想自己连澡都还没洗呢,便去洗了个冷水澡. 煮了杯浓浓的咖啡喝了下去,我 ...

  10. 使用Ajax实现的批量删除操作(C#)

    今天做了一个简单的批量删除操作,虽然简单,但是很多问题出现,终究还是技术不够熟练. 现在在这里跟大家分享一下.仅供学习... 1.在前台获取用户点击的信息id,把这里id封装到一个数组里面:(rows ...