仿新浪微盾客户端项目简介四

上节我们说到我们主要的算法是在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算法后值,起到一个不产生重复值的效果,提高威盾的安全性。

时间: 2024-09-17 04:16:06

仿新浪微盾客户端项目简介四的相关文章

仿新浪微盾客户端项目简介二

这个新浪微盾客户端的核心算法,就是这个OTP算法. 这个otp算法是什么了? OTP是One-Time Password的简称,可称之为一次性口令,也称动态口令.每个口令只能使用一次,按照时间或使用次数不断动态变化,是随机.不可预测.不重复使用的数字组合. 这个OTP算法,在大型企业中,办公网的接入和VPN的访问或者其他重要数据的访问等通常都需要使用一次性口令来进行认证.   常用OTP算法说明 1.1 HOTP(基于事件) 1.1.1 算法概述 HOTP算法是基于一个加法计数器和一个静态对称密

仿新浪微盾客户端项目简介三

上节我们说到,关于opt算法的说明,也说到这个项目是使用TOTP(基于时间)方法.   这节讲的主要把它怎么整合项目中.整合项目中,此算法需要注意这么几点. 1. 与服务器端统一的准确时间 由于是使用totp算法,客户端与服务器端的算法是必须要保存一致的. 对时接口,获取服务器端准确时间,返回{"svr_time":1319512158},以秒为单位的时间戳.时间偏移量 = 本地时间 – 服务器端时间, 将时间偏移量保存在地SharePreference中,供计算动态密码时读取服务器端

为防止微博盗号,新浪微博推出新浪微盾

有网友爆料称,新浪微博准备推出新浪微盾,从而防止微博被盗号.而目前网友曝光的截图显示,微盾需要和微博账号绑定激活,然后在登录时需要输入微盾屏幕上的6位数字然后才可完成登录.在此前,根据媒体的报道,有众多的网友反映了自己的新浪微博疑似遭到盗号,因而被频繁要求修改密码. 而新浪微博则称,通过排查之后,他们发现了在近期多发账户被盗现象.显然用户可能在不同的网站注册时,也许经常会设置相同的密码,而某个网站的密码被盗,可能就会导致多个网站的账号被盗. 而在新浪微盾退出之前,新浪就已经推出了登录保护.安全提

新浪微博推出新浪微盾 防微博盗号(图)

12月22日消息,据 网友爆料,新浪微博推出新浪微盾(http://weibo.com/settings/security/vdun ),防止微博被盗号.网友 曝光的截图显示,微盾需要和账号绑定激活,登录时需要输入微盾屏幕上的6位数字方可完成登录.此前据媒体报道, 众多网友反映自己的新浪微博疑遭盗号,被频繁要求修改密码.新浪微博称,通过排查发现近期多发账户被盗现象.用户可能在不同的网站注册时,经常会设置相同的密码,某个网站的密码被盗,可能导致多个网站的账号被盗.在新浪微盾之前, 新浪推出了登录保

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

这是一个老黄历的事件,曾记得淘宝上的卖家卖10元卖50g网络硬盘,并且卖的相当的火,一个月就卖了500个账号.由于我也是那个事件的亲身经历者之一,这里就看到了IMEI号在项目中防止作弊是何其的重要. 是不是,觉得我说的什么云里雾里的东西吧.好吧,我这里就说整个事件的前因后果把.是这样子,那个时候,新浪的微盘还不是很火的时候,当然了新浪微盘一直都没有真正火爆过,他为了提高他的装机量,他的注册用户量.那个时候,htc的手机还是异常的火爆,他们同htc搞活动,要求内置微盘的客户端了,而htc则要求新浪

android仿新浪引导界面

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

新浪微游戏到底能走多远?

一场社交风潮席卷全球(兲朝自然也包括在内),引领者叫做facebook,尽管其在墙外,但是墙内的我们对其一举一动却极其关注.facebook,linkedin,zynga,一个个让人惊叹的名字,一个个财富神话,让墙内的我们羡慕不已,于是墙内的诸巨头也开始躁动不安鸟! 曾几何时,墙内有一位业界大牛,逢人必说myspace,但是当facebook袭来并且势无可挡的时候,他也不得不改口,逢人必说facebook!就到这里,不扯淡了,讲点正经事. 大家都以为墙外的高手才是高手,其实墙内也不乏高手,一个在

新浪微财富与玖富推PP猫 收益超宝宝50%以上

新浪微财富与 玖富推PP猫 收益超宝宝50%以上新浪科技讯 7月24日晚间消息,新浪微财富携手玖富微理财今日上午 正式推出第1期PP猫-玖富行业宝,收益超宝宝50%以上.微财富此次推出的PP猫-玖富行业宝就是一款P2P产品,本期包含两款产品,一款年化收益率10%(6月期),一款年化收益率11.5%(12月期),超 宝宝类产品50%以上,募集的资金全部用于已 有的真实借款项目.投资者购买PP猫-玖富行业宝之后,玖富微理财会将资金分散投资于优质小微企业债权,并出具债权列表,标明资金出借对象及其金额.

新浪微公益平台上线 开启“一站式”救助服务

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 2月19日,新浪微公益平台(gongyi.w eibo.com )正式上线公测,该平台专门面对微博用户开发,无论是求助者.救助者还是公益机构,均可通过微公益平台进行简易.便捷的操作,开启"一站式"救助服务.记者了解到,截至2月22日,已有6000名左右的网友参与了微公益平台项目的直接救助,所捐善款超过10万元.短短3个工作日内,就有公益项目筹集到了所有的目标资金. 1141名网友募得8000份午餐 "感谢1141名网友的