仿新浪微盾客户端项目简介四
上节我们说到我们主要的算法是在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算法后值,起到一个不产生重复值的效果,提高威盾的安全性。
仿新浪微盾客户端项目简介四相关推荐
- 开源软件FUFS(新浪微盘linux客户端)
FUFS 是一款基于linux c语言版fuse 开发的用户空间文件系统,实现了在linux 中对新浪微盘的基本操作.文件系统实现了对新浪微盘API的封装,当文件系统挂载到用户linux 的某个文件加 ...
- 淘宝上倒卖新浪微盘事件来龙去脉——谈谈巧用IMEI
这是一个老黄历的事件,曾记得淘宝上的卖家卖10元卖50g网络硬盘,并且卖的相当的火,一个月就卖了500个账号.由于我也是那个事件的亲身经历者之一,这里就看到了IMEI号在项目中防止作弊是何其的重要. ...
- mysql新浪微盘_Android62期视频教程全集下载
Android62期视频教程全集下载 课程介绍: 此套Android62期视频教程全集包括包括79部分的学习内容,视频和源码都有,资料比较多,下面我们就不一一做介绍了,简单的目录介绍一下,有需要学习完 ...
- android仿新浪引导界面
最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法. 实现功能:左右手势滑屏 底部小圆点随当前显示页跳动 浮动按钮显示.当触屏事件发生显示,否则就渐渐消失 先转个文 ...
- 新浪微盘项目的“病危通知”
据来自新浪微盘官方微薄的消息, 新浪微盘将关闭对免费用户的服务. 借口是"配合监管部门专项整治行动".但知情网友透露,"监管部门"这次实际上是被"黑锅 ...
- Android 新浪微盘API调用出现的问题
最近在写一个关于调用网盘API的android程序,估计是自己学习android网盘的时间比较晚把,许多网盘的开放API接口都关闭了. 最后只有选择新浪微盘作为练手的网盘. 新浪微盘有比较详细的开发文 ...
- 解决新浪微盘下载没反应下载中断
解决新浪微盘下载没反应下载中断 最近发现,用浏览器下载新浪微盘的资料,要么点击没反应,要么下载到一般就中断,下载失败.用了好多办法都不能解决.起初以为是服务器的问题,后来发现是浏览器的问题. ...
- 仿新浪抢工长装修招标网站源码老工长装修网源码装修网站源码
仿新浪抢工长装修招标网站源码 老工长装修网源码 装修网站源码 源码虽然不大但是没有错版,测试运行都是很正常的.希望大家能喜欢. 源码里面的配图我都没有改,很多失效的图大家可以自行去添加... 下载链接 ...
- 仿新浪抢工长装修招标网站源码
仿新浪抢工长装修招标网站源码 老工长装修网源码 装修网站源码 强大的装修装潢公司网站源码,功能很全,有易于管理的后台,和页面的精美.后台功能强大,带会员系统,可以完整商业运营. 源码虽然不大但是没有错 ...
最新文章
- boost::log模块实现一个简单日志的例子
- OpenCV检测计算并匹配BRISK和AORB KAZE描述的实例(附完整代码)
- 前端学习(781):格式化日期年月日星期
- 作者:刘挺(1972-),男,哈尔滨工业大学教授,社会计算与信息检索研究中心主任。...
- start uml怎么自动生成代码_基于UML-RT和Papyrus-RT的系统建模与代码生成
- 没有Angular 3,下一个Angular主版本将是Angular 4
- SSM框架02--mybatis(1)
- Windows Phone 7 Jump Start 系列教程
- python模糊匹配_python 字符串模糊匹配 Fuzzywuzzy
- 看看五年MacBook使用经验平常都用那些软件
- 计算机专业小米笔记本推荐,小米笔记本哪款好
- 进程同步——信号量机制(操作系统)
- Photoshop 颜色理论(转)
- Vj程序设计作业H5
- 新媒体运营模式的发展历史
- 讨厌google.cn怎么办?
- Java开发Telegram机器人
- 通用的产品功能设计方法
- 上级对下级用通知合适吗_“通知”是上级给下级的还是下级给上级的?
- 数学建模竞赛知识点汇总(一)——层次分析法
热门文章
- java 当前日期 所在周_关于Java的小工具(计算当前日期所在周的区间)
- 推荐10个优秀GitHub仓库
- Webpack 中 resolve 路径解析
- 三分钟带你弄懂slot插槽——vue进阶
- 《学习JavaScript数据结构与算法》 第四章笔记 栈
- 阿诺德图像加密c语言,基于Arnold变换的数字图像加密算法
- python建模 决策_决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:...
- 怎么用python统计字数_Python 统计字数的思路详解
- Javascript找出所有没有重复的字符(优化)
- jQuery的创建对象,动态添加、修改、删除属性和方法