当我们被要求开发一个登录屏幕并且有一个“记住我”复选框或自动登录功能时,我们所要做的就是将登录凭据或某种令牌保存到本地存储中。所以,下次我们回到应用程序时,我们发现表单已经填写了我们的凭据,或者更好的是,自动登录将我们从无聊的登录屏幕中解救出来。
太棒了,是的。但是安全呢?
如果我们将用户的凭据存储到 SharedPreferences 中,我们可能会将这些数据暴露给攻击者,而攻击者可能会窃取它们。
幸运的是,Flutter 社区足够大,可以创建一个涵盖此场景的包。
有一个名为flutter_secure_storage的包,由 GitHub 用户mogol创建,它将数据存储到 iOS 的 Keychains 中,并使用 AES 加密和 Android 的 Keystore。Android 版本,从 v5.0.0 开始,它也支持 EncryptedSharedPreferences。
从 4.2.1 升级到 5.0.0 时,您可以通过将 encryptedSharedPreference 参数设置为 true 来迁移到 EncryptedSharedPreferences,如下所述。这将自动迁移所有首选项。然而,这无法撤消。如果您在此之后尝试禁用 encryptedSharedPreference,您将无法读取这些值。您只能阅读启用了 encryptedSharedPreference 的那些。
Android 有一个注意事项:当引入 Keystore 时,此插件仅与 Android SDK 18+ 兼容。
现在看看我们如何将这个插件用于登录屏幕。
这是我们要创建的登录页面。
当您使用凭据填写表单并按下登录按钮时,您会将它们存储到安全存储中。当您返回应用程序时,您会发现您的凭据已自动填写在表格中。
这是一个简单的登录 UI,其背后包含任何类型的登录业务逻辑。我不会使用任何一种状态管理,只会使用旧的好setState()。这只是一个简单的代码示例来展示包的使用。
好的,让我们编码。
首先,我们需要将包添加到pubspec.yaml文件中。
是的,但是…如何flutter_secure_storage工作?
正如报告中的那样README.md,我们所要做的就是:
这是一个非常简单的包,是的。
如您所见,在第 4 行,我们创建了一个存储,使我们能够读取和存储数据。
在第 7 行,我们读取并解密由标签标识的 String 值,如果不在存储中,则为keynull 。key请记住:key不应为空。
在第 19 行,我们存储并加密value由标签标识的对象key。如果key已经在存储中,则其关联value将被更改。如果value为空,则删除与value给定的关联key。
对于我们的用例,我们需要:
- FlutterSecureStorage存储实例;
- 两个TextEditingController与两个TextInputField小部件关联以收集用户凭据;
- 一种将write数据存储起来的方法;
- 一种read从存储中获取数据的方法;
所以让我们定义前两点:)
然后,我们定义_onFormSubmit()存储用户凭据的方法。Sing In此方法是与按钮关联的操作。仅当验证表单时,该方法才会负责将数据保存在存储中。
然后,我们定义方法_readFromStorage()。我们从 中调用这个方法initState(),这样在构建我们的 UI 之前就会检索到存储中的信息。
在创建 State 时,从框架中调用 initState() 方法。(所以它只被调用一次,在 UI 被绘制之前)。
通过这种方式,我们得到了以下屏幕截图中显示的行为。
在第一次登录时,用户输入他们的凭据并按下登录按钮。
稍后,当他再次打开应用程序时,他会发现他的凭据已经输入到表单中。
做得好!这些简单的说明将允许您向应用程序添加自动登录功能,但最重要的是,存储的信息将在安全存储中加密。
通过这些简单的步骤,您的应用程序将升级。
结论
flutter_secure_storage 是一个非常简单的包,只需几个简单的步骤,我们就可以将用户数据加密保存在安全存储中。