内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

密码管理APP(一):锁屏方案

2018-05-15 14:48 出处:清屏网 人气: 评论(0

背景

随着互联网的发展,现实生活中注册了太多的账号,不敢用同一个密码,不然哪天一个网站被窃,然后其他账号被撞库就悲催了。

本身不同账号不同密码就不容易记忆,即使加规则,说不好哪天要改密码后规则又不一致了……

甚至于,有时候都记不得账号本身!

当前有不少管理密码的工具, 比如1password。

密码管理工具,就好比钥匙串,拿着它,那个房间都可以进入-_-

方案

不过如果自己手撕一个APP,应该也不难。

自己做一个管理密码APP,要做些什么呢?

1、存储方案:网站-账号-密码,数据模型很简单,用sqlite做点增删改查就好;

2、交互:展示列表,编辑页,搜索框,再者就是简单的报表(可选);

3、加密方案:用户输入的 accessKey 作为AES的key进行存储, 同时对accessKey计算摘要,保存起来(下次进入时对比)。

当然,计算摘要部分,不能仅仅是算SHA或者MD5,需要组合其他一些手段,

防止一些在线破解库查找出密码,或者彩虹表攻击等等,这里就不多展开了。

4、锁屏界面:打开APP及一段时间后回来,需要显示锁屏界面,解锁成功方可进入。

5、其他细节: 比如解锁5次不成功就锁定10分钟等。

锁屏方案

到了锁屏界面,很自然地就想到九宫格了。

应用市场上也确实不少密码管理APP用九宫格作为锁屏密码。

那么用九宫格作为锁屏密码安全吗?

这个要看场景,一般来说是安全的,如果对方手动去尝试的话……

试想这么一种场景:

手机丢了,被人捡到,假如这个人精通逆向APP,然后找到了生成key的摘要的关键代码,以及key的原始封装格式(比如简单的"12369"?);

然后会root手机,找到存储key的摘要地方,读取之。

然后开始遍历九宫格的各种路径,封装成逆向出来的格式,计算摘要,存储的密钥对比……

最终,破解时间取决于遍历九宫格的复杂度和计算一次摘要的耗时。

那么,遍历完九宫格的路径,有多少种可能呢?

编码如下:

public class TestClass {
    // 用int的低2到10bit标记是否到达过
    // 为方便索引,最低位不用(one-based)
    private static final int[] MASK = new int[]{
            1,
            1 << 1, 1 << 2, 1 << 3,
            1 << 4, 1 << 5, 1 << 6,
            1 << 7, 1 << 8, 1 << 9
    };

    /*
    注意,有的数字是不连通的,
    比如1到3,7,9,中间要跨越一个点,所以无法直接相连
    1, 2, 3
    4, 5, 6,
    7, 8, 9
     */
    private static final int[][] MAP = new int[][]{
            {},
            {2, 4, 5, 6, 8},
            {1, 3, 4, 5, 6, 7, 9},
            {2, 4, 5, 6, 8},
            {1, 2, 3, 5, 7, 8, 9},
            {1, 2, 3, 4, 6, 7, 8, 9},
            {1, 2, 3, 5, 7, 8, 9},
            {2, 4, 5, 6, 8},
            {1, 3, 4, 5, 6, 7, 9},
            {2, 4, 5, 6, 8}
    };

    // 计数器
    private static int count = 0;

    // DFS
    private static void search(int p, int flag, int deep) {
        count++;
        if (deep == 9) {
            return;
        }
        flag |= MASK[p];
        int[] a = MAP[p];
        for (int n : a) {
            if ((flag & MASK[n]) == 0) {
                search(n, flag, deep + 1);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        for (int i = 1; i <= 9; i++) {
            search(i, 0, 1);
        }
        // 140249
        System.out.println(count);

        // 3.9
        System.out.println((float) count / (60 * 60 * 10));
    }
}

很久没撸算法了,若有考虑不周以致计算有误,敬请指正。

最后时间估算部分,保守估计,假如1秒可以算10个摘要的话,最长只需3.9个小时。

事实上可能更快,因为一方面APP计算摘要不能太久(不然影响用户体验),另一方面,PC的计算速度比移动终端要快很多。

既然这么快就可破解,那为什么九宫格应用这么广泛呢?

这个分情况,假如具备以下两点:

1、解锁进入后看到内容不是十分重要;

2、关键操作有第二道关卡。

比方说,即使进入看到余额,但是不能交易(没有交易密码),则问题不大。

还有就是,相比戳键盘,九宫格操作更流畅。

总的来说,九宫格是均衡安全性和方便性的产物。

有人可能说,手机落到别人手上,被别人通过短信修改密码怎么办?

确实,手机落到坏人手上确实很可怕,所以,丢手机后的第一件事:尽快补办手机卡!

九宫格主要用于防人的,若是落得被计算机爆破,很快就会沦陷。

苹果的锁屏也很简单(6个数字),为什么就不怕被爆破?

只能说苹果的加密手段比较先进-_-

上面提到的破解场景,前提是逆向了APP的加密规则并且提取了存储的key的摘要。

如果这两方面加强,可以多少增加其破解APP的难度。

不过这仅仅是增加破解APP的难度而已,一旦破解了APP, 接下来就是破解密码了。

结论

为了不被破解密码,注册账号时一般都会提醒设置一些强度高一点密码(混合大小写数字和字符)。

对于管理密码的APP, 不建议用九宫格作为APP的大门。

那用什么呢?笔者当前想到的也就是传统的键盘输入了,如果更慎重一点的话可以自定义键盘。

结束语

之前就有想法要做一款密码管理APP,无奈各种事情拖延而未开展,今天算是打响第一枪吧!

欲听后事如何,且听下回分解。

最后,求推荐一款好看的开源列表,良辰——先在此谢过了-_-

分享给小伙伴们:
本文标签: 锁屏密码管理

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号