Android 为每个设备创建确定性一次性密码

Android 为每个设备创建确定性一次性密码,android,security,random,passwords,Android,Security,Random,Passwords,我想在一套平板电脑上安装一个android应用程序,供公司内部使用。这些平板电脑将在现场使用,我希望密码在30天后过期,并每30天切换到一个预先确定(但看似随机)的密码。我希望每个平板电脑/应用程序安装的密码都是唯一的。在发布之前,我将自己在每个平板电脑上安装这些应用程序 我查看了各种OTP方案,但找不到一种不需要连接到服务器就能工作的方案。老实说,我以前从未做过这样的事情,有点不知所措。这些平板电脑中的大多数在野外时都不能上网,我希望30天后用户能打电话获取下一个密码 因此,理想情况下,每个设

我想在一套平板电脑上安装一个android应用程序,供公司内部使用。这些平板电脑将在现场使用,我希望密码在30天后过期,并每30天切换到一个预先确定(但看似随机)的密码。我希望每个平板电脑/应用程序安装的密码都是唯一的。在发布之前,我将自己在每个平板电脑上安装这些应用程序

我查看了各种OTP方案,但找不到一种不需要连接到服务器就能工作的方案。老实说,我以前从未做过这样的事情,有点不知所措。这些平板电脑中的大多数在野外时都不能上网,我希望30天后用户能打电话获取下一个密码

因此,理想情况下,每个设备都有一个预先确定的伪随机数序列,用户将获得本月的密码,30天后,他们必须打电话获取特定平板电脑当月的密码

希望这是有意义的


谢谢

好的,我将介绍一些关于如何实现这一目标的想法

当我读到这篇文章时,我的第一个想法是“你可以通过与服务器交互来完成所有这些,坦率地说,有了这种支持就很容易了”,当然,直到你注意到这是不可能的

我是在几个假设下提出这些建议的:

  • 您公司的任何人都不会试图以任何方式利用该应用程序-例如过度填充或更改应用程序语言或utf设置等。他们也不会尝试查看任何源文件

  • 在你公司的人使用这些设备之前,你总是能拿到它们

  • 好吧,那么,30天困境的处理:最简单的方法(尽管也是最容易出错的方法)是在用户登录时获取系统当前时间(和日期),并将该“天”设置为计数器“30”或“0”。这可以通过
    time now=new time()完成;
    now.setToNow();
    Calendar c=Calendar.getInstance();
    。存储这一天“在您自己的
    SharedReferences
    或仅在
    DefaultSharedReferences
    中。每次应用程序启动时,请将这一天与您当前的一天进行核对,并计算它已经运行了多少天。如果当前天数大于等于30天,请重置密码

    ^这是解决这个问题的最简单的方法之一,也是非常“错误…满了?”(想不出一个好词)的方法。现在进入密码:

    我建议使用UUID作为密码。虽然所生成的标识符在“技术上”不是唯一的,但两次获得相同密码的机会非常接近于零,在您的情况下,这可能不会发生

    生成这些文件并存储,比如说1000个不同的文件到每个设备上(一个简单的文本文件,每个密码在不同的行上会起作用),并在您自己的记录中保存一份副本(确保您知道哪些密码指向哪个设备)

    然后,当早前的日历计数器熄灭时,将应用程序的密码设置为文件中的“下一个”密码,从文件中删除上一个密码。公司员工用他的应用程序Id(生成一个用户可以在每个应用程序中看到的应用程序Id)给你打电话。因此,第一个收到他的应用程序的人有应用程序1,第二个是应用程序2等。这样你就知道你应该从哪个密码文件读取)你可以向他发送新密码

    这是两种处理这个问题的简单方法,但它们至少可以让你思考。希望我能帮点忙