上节我们说到我们主要的算法是在Google的一个开源项目Google Authenticator 修改的。那么我们窥探一下Google Authenticator的全貌。

我们通过源代码来了解,上代码:

首先是一些噼里啪啦的定义的常量,变量。

private static final int PASS_CODE_LENGTH = 6;static final int INTERVAL = 30;private static final int ADJACENT_INTERVALS = 1;private static final int PIN_MODULO = (int) Math.pow(10, PASS_CODE_LENGTH); // pow是求10的PASS_CODE_LENGTH次方private final Signer signer;private final int codeLength;private final int intervalPeriod;public boolean isCreated;public long timeOffset;private Handler handler;

这些所谓的常量了,定义了他产生的的长度和时间。从这些定义的常量我们可以得出来这么的结果。他是每30秒的中的时间了产生了一个不同的code,并且他产生的值是在000000-100000中的值。下面变量主要是判断他是否创建了,并且由handler来异步处理相应的结果。

下面源代码是一个接口和四个构造函数方法的重载。

interface Signer {byte[] sign(byte[] data) throws GeneralSecurityException;}public PasscodeGenerator(Mac mac) {this(mac, PASS_CODE_LENGTH, INTERVAL);}public PasscodeGenerator(final Mac mac, int passCodeLength, int interval) {this(new Signer() {public byte[] sign(byte[] data) {return mac.doFinal(data);}}, passCodeLength, interval);}public PasscodeGenerator(final Mac mac, int passCodeLength, int interval,Handler handler) {this(mac, passCodeLength, interval);this.handler = handler;}public PasscodeGenerator(Signer signer, int passCodeLength, int interval) {this.signer = signer;this.codeLength = passCodeLength;this.intervalPeriod = interval;}

这个接口是实现观察者模式,能将byte数组转换成签名后到底byte的数组了。而不同的构造函数,无非是实现方法层面的多态,传递不同的参数,得到的处理结果.

下面的源代码做的归根结底,就是这么一件事情,能够根据传递进来的时间类型来产生了相应的值输出了,当然了,这又有一些的复杂的逻辑判断了,使其不产生了相应重复的数字。

private String padOutput(int value) {String result = Integer.toString(value);for (int i = result.length(); i < codeLength; i++) {result = "0" + result;}return result;}public String generateTimeoutCode(boolean isCreated ,long timeOffset)throws GeneralSecurityException {this.timeOffset = timeOffset;this.isCreated = isCreated;return generateResponseCode(clock.getCurrentInterval());}public String generateResponseCode(long challenge)throws GeneralSecurityException {byte[] value = ByteBuffer.allocate(8).putLong(challenge).array();return generateResponseCode(value);}public String generateResponseCode(byte[] challenge)throws GeneralSecurityException {byte[] hash = signer.sign(challenge);int offset = hash[hash.length - 1] & 0xF;int truncatedHash = hashToInt(hash, offset) & 0x7FFFFFFF;int pinValue = truncatedHash % PIN_MODULO;return padOutput(pinValue);}private int hashToInt(byte[] bytes, int start) {DataInput input = new DataInputStream(new ByteArrayInputStream(bytes,start, bytes.length - start));int val;try {val = input.readInt();} catch (IOException e) {throw new IllegalStateException(e);}return val;}public boolean verifyResponseCode(long challenge, String response)throws GeneralSecurityException {String expectedResponse = generateResponseCode(challenge);return expectedResponse.equals(response);}public boolean verifyTimeoutCode(String timeoutCode)throws GeneralSecurityException {return verifyTimeoutCode(timeoutCode, ADJACENT_INTERVALS,ADJACENT_INTERVALS);}public boolean verifyTimeoutCode(String timeoutCode, int pastIntervals,int futureIntervals) throws GeneralSecurityException {long currentInterval = clock.getCurrentInterval();String expectedResponse = generateResponseCode(currentInterval);if (expectedResponse.equals(timeoutCode)) {return true;}for (int i = 1; i <= pastIntervals; i++) {String pastResponse = generateResponseCode(currentInterval - i);if (pastResponse.equals(timeoutCode)) {return true;}}for (int i = 1; i <= futureIntervals; i++) {String futureResponse = generateResponseCode(currentInterval + i);if (futureResponse.equals(timeoutCode)) {return true;}}return false;}

下面的源代码,是通过了colock对象来产生相应值。

private IntervalClock clock = new IntervalClock() {public long getCurrentInterval() {long currentTimeSeconds = (System.currentTimeMillis() - timeOffset) / 1000;long count = currentTimeSeconds / getIntervalPeriod();if (isCreated) {long i = getIntervalPeriod()- (currentTimeSeconds % getIntervalPeriod());Message msg = new Message();msg.what = MainActivity.UPDATE_COUNTDOWN;msg.arg1 = (int) i;handler.sendMessage(msg);}return count;}public int getIntervalPeriod() {return intervalPeriod;}};interface IntervalClock {int getIntervalPeriod();long getCurrentInterval();}

观察源代码,我们可以清晰开出来,相应时间的毫秒通过整除,求摸这些基本的变化,来得到最终的6位时间格式的值。

总之,通过这个类,能够得到了hopt算法后值,起到一个不产生重复值的效果,提高威盾的安全性。

仿新浪微盾客户端项目简介四相关推荐

  1. 开源软件FUFS(新浪微盘linux客户端)

    FUFS 是一款基于linux c语言版fuse 开发的用户空间文件系统,实现了在linux 中对新浪微盘的基本操作.文件系统实现了对新浪微盘API的封装,当文件系统挂载到用户linux 的某个文件加 ...

  2. 淘宝上倒卖新浪微盘事件来龙去脉——谈谈巧用IMEI

    这是一个老黄历的事件,曾记得淘宝上的卖家卖10元卖50g网络硬盘,并且卖的相当的火,一个月就卖了500个账号.由于我也是那个事件的亲身经历者之一,这里就看到了IMEI号在项目中防止作弊是何其的重要. ...

  3. mysql新浪微盘_Android62期视频教程全集下载

    Android62期视频教程全集下载 课程介绍: 此套Android62期视频教程全集包括包括79部分的学习内容,视频和源码都有,资料比较多,下面我们就不一一做介绍了,简单的目录介绍一下,有需要学习完 ...

  4. android仿新浪引导界面

    最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法. 实现功能:左右手势滑屏 底部小圆点随当前显示页跳动 浮动按钮显示.当触屏事件发生显示,否则就渐渐消失 先转个文 ...

  5. 新浪微盘项目的“病危通知”

    据来自新浪微盘官方微薄的消息, 新浪微盘将关闭对免费用户的服务. 借口是"配合监管部门专项整治行动".但知情网友透露,"监管部门"这次实际上是被"黑锅 ...

  6. Android 新浪微盘API调用出现的问题

    最近在写一个关于调用网盘API的android程序,估计是自己学习android网盘的时间比较晚把,许多网盘的开放API接口都关闭了. 最后只有选择新浪微盘作为练手的网盘. 新浪微盘有比较详细的开发文 ...

  7. 解决新浪微盘下载没反应下载中断

    解决新浪微盘下载没反应下载中断      最近发现,用浏览器下载新浪微盘的资料,要么点击没反应,要么下载到一般就中断,下载失败.用了好多办法都不能解决.起初以为是服务器的问题,后来发现是浏览器的问题. ...

  8. 仿新浪抢工长装修招标网站源码老工长装修网源码装修网站源码

    仿新浪抢工长装修招标网站源码 老工长装修网源码 装修网站源码 源码虽然不大但是没有错版,测试运行都是很正常的.希望大家能喜欢. 源码里面的配图我都没有改,很多失效的图大家可以自行去添加... 下载链接 ...

  9. 仿新浪抢工长装修招标网站源码

    仿新浪抢工长装修招标网站源码 老工长装修网源码 装修网站源码 强大的装修装潢公司网站源码,功能很全,有易于管理的后台,和页面的精美.后台功能强大,带会员系统,可以完整商业运营. 源码虽然不大但是没有错 ...

最新文章

  1. boost::log模块实现一个简单日志的例子
  2. OpenCV检测计算并匹配BRISK和AORB KAZE描述的实例(附完整代码)
  3. 前端学习(781):格式化日期年月日星期
  4. 作者:刘挺(1972-),男,哈尔滨工业大学教授,社会计算与信息检索研究中心主任。...
  5. start uml怎么自动生成代码_基于UML-RT和Papyrus-RT的系统建模与代码生成
  6. 没有Angular 3,下一个Angular主版本将是Angular 4
  7. SSM框架02--mybatis(1)
  8. Windows Phone 7 Jump Start 系列教程
  9. python模糊匹配_python 字符串模糊匹配 Fuzzywuzzy
  10. 看看五年MacBook使用经验平常都用那些软件
  11. 计算机专业小米笔记本推荐,小米笔记本哪款好
  12. 进程同步——信号量机制(操作系统)
  13. Photoshop 颜色理论(转)
  14. Vj程序设计作业H5
  15. 新媒体运营模式的发展历史
  16. 讨厌google.cn怎么办?
  17. Java开发Telegram机器人
  18. 通用的产品功能设计方法
  19. 上级对下级用通知合适吗_“通知”是上级给下级的还是下级给上级的?
  20. 数学建模竞赛知识点汇总(一)——层次分析法

热门文章

  1. java 当前日期 所在周_关于Java的小工具(计算当前日期所在周的区间)
  2. 推荐10个优秀GitHub仓库
  3. Webpack 中 resolve 路径解析
  4. 三分钟带你弄懂slot插槽——vue进阶
  5. 《学习JavaScript数据结构与算法》 第四章笔记 栈
  6. 阿诺德图像加密c语言,基于Arnold变换的数字图像加密算法
  7. python建模 决策_决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:...
  8. 怎么用python统计字数_Python 统计字数的思路详解
  9. Javascript找出所有没有重复的字符(优化)
  10. jQuery的创建对象,动态添加、修改、删除属性和方法