【问题标题】:Android Application first runAndroid 应用程序首次运行
【发布时间】:2023-03-09 02:35:01
【问题描述】:

在我的应用程序中,我存储敏感的用户数据(如银行详细信息),用户可以使用单独的密码锁定每个详细信息。我希望用户在安装后第一次运行应用程序时设置一个主密码,以便他可以通过输入这个主密码来恢复数据,以防他忘记密码。 p>

所以,安装后第一次运行应用程序时,会弹出要求他设置主密码,用户需要设置密码才能继续。

但是,当应用程序在手机重启或关闭应用程序后启动时,他不应该得到弹出窗口。

安装后第一次运行应用程序时,弹出窗口应仅出现一次。

假设setMasterPassword() 是创建对话框的函数,第一次运行时我应该在哪里调用这个函数?

android有没有参数可以判断app是新安装的?

或者我应该只使用 Preference Variables 来检查吗? {类似于将 PreferenceVariable 中的计数器初始化为 0,然后在 onCreate() 中检查此值,当且仅当计数器为 0 时调用 setMasterPassword(),然后将计数器递增 1,这样它就不会被再次调用。}

最好的方法是什么?

提前致谢!

【问题讨论】:

标签: android


【解决方案1】:

我也试图弄清楚是否有“全新安装”布尔值,但似乎没有类似的东西,所以你应该选择一个共享偏好,就像人们所做的那样 here

PS:顺便说一句,这是那个问题的重复。

PS2:请记住,如果用户删除了您应用程序的所有存储信息,该检查也将被删除,因此您可以再次输入。

如何提高您的信息安全:

  1. 将用户信息与一些控制字节(随机数、特定字符串等)一起存储,并使用用户密码对其进行加密。
  2. 当您需要用户信息时,获取该文件,尝试使用用户密码解密其内容(每次都询问)
  3. 检查控制字节(substr() 可能就足够了)。如果它们相同,则获取信息。如果不是,请再次提示。

这样,你会得到一些好处:

  • 您不会将用户密码存储在任何地方。 SharedPreferences 不会存储这个,只会存储“firstTime”变量。
  • 如果用户转储应用程序的信息,再次输入密码不会减少您的信息。
  • 从资源管理器打开该文件只会显示一堆数字、符号和可能不可读的字节,这些字节大多会破坏编辑器。

【讨论】:

  • 是的,所以如果我的手机掉到了别人的手上,他删除了手机中的所有应用程序信息,那么将再次询问主密码。其他用户即使不知道每个文件的密码,也可以设置新密码并轻松访问所有数据。在这种情况下,安全性变得毫无意义。
  • 因此我不愿意在 PreferenceVaraibles 中实现它。没有其他方法可行吗?
  • 您是否考虑过加密您存储的信息?实际上,如果唯一的保护是打开文件或不打开文件,您可以使用任何文件资源管理器获取该文件。检查我的编辑
  • 感谢您的建议。是的,数据将被加密并保存。但我担心的是,如果恶意用户设置了新的 masterPassword,那么即使他没有相应文件的密码,应用程序也会很乐意为他解密。 masterPassword 可以帮助用户检索信息,即使他忘记了他为文件设置的密码。因此,即使其他用户清除了应用程序信息并创建了新的 masterPassword,也无法检测到这一点。
  • @swayam IMO 对于此类敏感信息,最好使用基于服务的应用程序初始化。如果用户通过初始化标志将在服务器端设置。如果有人在不删除该标志的情况下删除了应用程序,则初始化标志将保留。第二次初始化将检查设备ID,设置新密码失败。这就是我正在做的事情。
【解决方案2】:

在某个地方找到了这段代码,它对我非常有用。 所以,我想它也可能对你有所帮助。

看看吧。

使用 SharedPreference 存储 firstrun 值,并根据该值检查您的启动活动。如果设置了值,则无需显示对话框。否则,显示对话框并将 firstrun 标志保存在 SharedPreference 中。

在您的 MainActivity 中:

public void onCreate(){
    boolean firstrun = getSharedPreference("PREFERENCE", MODE_PRIVATE).getBoolean("firstrun", true);
    if (firstrun){
   [[ ...Display the dialog ]]
    // Save the state
    getSharedPreference("PREFERENCE", MODE_PRIVATE)
        .edit()
        .putBoolean("firstrun", false)
        .commit();
    }
}

【讨论】:

    【解决方案3】:

    因此也是单通身份验证的缺点。如果恶意用户设法获取/更改密码,则您设置的任何机制都不会阻止他们。如果信息真的那么敏感,您可能需要启用第二个身份验证机制(安全问题、电子邮件确认等)

    【讨论】:

    • 或者我可以在设置新的 masterPassword 时清除我的手机数据库?这将删除所有文件,恶意用户将无法访问任何数据。
    • 那也行。但是,如果用户定期更改密码(就像我们都被教导的那样),它可能会让用户感到烦恼。作为开发人员,您将不得不在安全性和可用性之间取得平衡。我建议不要将密码用作密钥(人们因创建错误密码而臭名昭著)并使用您自己的密钥。然后需要某种形式的第二次身份验证(可能是输入密码后的电子邮件确认?当然,如果电子邮件发送到手机可能没用。)以访问数据。
    • 也许他可以在这种情况下利用共享偏好。如果提示用户进行全新安装,则删除任何内容。如果他尝试重置密码(与全新安装不同),他可以保留该信息。一切都是为了设计良好的用户交互。
    • 这可行。这真的归结为他如何存储所有这些数据。我认为他必须在任何技术谈话开始之前了解他的大局。
    • 感谢您的建议。我想我可以检查新安装或更改密码并采取相应措施。但话又说回来,一切都依赖于 SharedPreferences。我想这将是唯一的离线方式,另一种是将身份验证请求发送到服务器。
    【解决方案4】:

    最好的方法是在安装时设置接收器。

    <receiver android:name =".CLASSNAME">
         <intent-filter>
                     <action android:name="com.android.vending.INSTALL_REFERRER"/>
    
          </intent-filter>
          </receiver> 
    

    (如果您不熟悉这些,您将需要创建一个名为“CLASSNAME”的 BroadcastReciever 扩展类来接收广播。)

    另外,除非它在市场上出现,否则安装引荐来源网址将不起作用,因此您可以按照此堆栈溢出答案来模拟虚假安装; How to test android referral tracking?

    祝你好运。

    【讨论】:

    • 注意,新安装的包收不到这个广播。所以他需要之前安装另一个应用程序来控制那个事件?
    • @Maxim :我熟悉 BroadcastReceivers 但不熟悉 PACKAGE_ADDED 操作。你确定新添加的包不会收到这个广播吗?
    • 我从参考资料中复制了“注意”。 developer.android.com/reference/android/content/…
    • 对不起,我给错了名字试试这个接收器; "com.android.vending.INSTALL_REFERRER" ...您也可以在接收者清单声明中省略方案
    • 很抱歉,我不明白您在清单中省略“scheme”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多