为了改进Android的安全问题,Google在Android系统中引入了谷歌验证应用(Google Authenticator)来保证账号的安全。谷歌验证应用的使用方法是:用户安装手机客户端,生成临时身份验证码,提交到服务器验证身份,类似的验证系统还有Authy。Robbie在其GitHub页面发布了自己用Go语言实现的版本,并撰写了一篇博文来解释其工作原理。
通常来讲,身份验证系统都实现了基于时间的一次性密码算法,即著名的TOTP(Time-Based One-Time Password)。该算法由三部分组成:
1.一个共享密钥(一系列二进制数据)
2.一个基于当前时间的输入
3.一个签名函数
1、 共享密钥
用户在创建手机端身份验证系统时需要获取共享密钥。获取的方式包括用识别程序扫描给定二维码或者直接手动输入。密钥是三十二位加密,至于为什么不是六十四位,可以参考维基百科给出的解释。
对于那些手动输入的用户,谷歌身份验证系统给出的共享密钥有如下的格式:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
256位数据,当然别的验证系统可能会更短。
而对于扫描的用户,QR识别以后是类似下面的URL链接:
otpauth://totp/Google%3Ayourname@gmail.com?secret=xxxx&issuer=Google
2、 基于当前时间的输入
这个输入是基于用户手机时间产生的,一旦用户完成第一步的密钥共享,就和身份验证服务器没有关系了。但是这里比较重要的是用户手机时间要准确,因为从算法原理来讲,身份验证服务器会基于同样的时间来重复进行用户手机的运算。进一步来说,服务器会计算当前时间前后几分钟内的令牌,跟用户提交的令牌比较。所以如果时间上相差太多,身份验证过程就会失败。
3、 签名函数
谷歌的签名函数使用了HMAC-SHA1。HMAC即基于哈希的消息验证码,提供了一种算法,可以用比较安全的单向哈希函数(如SHA1)来产生签名。这就是验证算法的原理所在:只有共享密钥拥有者和服务器才能够根据同样的输入(基于时间的)得到同样的输出签名。伪代码如下:
hmac = SHA1(secret + SHA1(secret + input))
算法流程简介
首先需要用base32解码密钥,为了更方便用户输入,谷歌采用了空格和小写的方式表示密钥。但是base32不能有空格而且必须大写,处理伪代码如下:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))
接下来要从当前时间获得输入,通常采用Unix时间,即当前周期开始到现在的秒数
input = CURRENT_UNIX_TIME()
input = CURRENT_UNIX_TIME() / 30
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret))) input = CURRENT_UNIX_TIME() / 30 hmac = SHA1(secret + SHA1(secret + input))
four_bytes = hmac[LAST_BYTE(hmac):LAST_BYTE(hmac) + 4] large_integer = INT(four_bytes) small_integer = large_integer % 1,000,000
本文向大家介绍Node.js中require的工作原理浅析,包括了Node.js中require的工作原理浅析的使用技巧和注意事项,需要的朋友参考一下 几乎所有的Node.js开发人员可以告诉你`require()`函数做什么,但我们又有多少人真正知道它是如何工作的?我们每天都使用它来加载库和模块,但它的行为,对于我们来说反而是一个谜。 出于好奇,我钻研了node的核心代码来找出在引擎下发生了什么
其中“url”是JSON格式的,它使用http GET方法返回大量数据。 我无法从我在getResultForRequest(url)方法中传递的“url”中获取JSON格式的数据。我在urlConnection.connect();中出错。Internet权限也在AndroidManifest.xml文件中给出。 这是我的日志。 提前谢谢。
我已经设置了接收通知的代码,但它不起作用: 我用它在我的主要活动,我尝试了它,因为电话是待机。我该怎么解决?它需要其他代码吗?我遵循了以下指南:http://www.dre.vanderbilt.edu/~schmidt/android/android-4.0/out/target/common/docs/doc-comment-check/guide/topics/ui/notifiers/no
Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。它能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。要理解HDFS的内部工作原理,首先要理解什么是分布式文件系统。 1.分布式文件系统 多台计算机联网协同工作(有时也称为一个集群)就像单台系统一样解决某种问题,这样的系统我们称之为分布式系统。 分布
更多面试题总结请看:【面试题】技术面试题汇总 malloc / free 简介 void *malloc(size_t size) void free(void *ptr) malloc 分配指定大小的内存空间,返回一个指向该空间的指针。大小以字节为单位。返回 void* 指针,需要强制类型转换后才能引用其中的值。 free 释放一个由 malloc 所分配的内存空间。ptr 指向一个要释放内存
一、mitmproxy的工作原理 Mitmproxy是一种非常灵活的工具。准确了解代理过程的工作原理将有助于您创造性地部署代理,并考虑其基本假设以及如何解决这些假设。本文档详细介绍了mitmproxy的代理机制,从最简单的未加密显式代理开始,到最复杂的交互操作-在存在服务器名称指示的情况下,对受TLS保护的流量进行透明的代理。 二、显式HTTP 配置客户端以使用mitmproxy作为显式代理是拦截