如何在 Flutter 应用程序中安全地保存令牌并在我们发出任何请求时发送令牌
How to Save Token in securely in Flutter app and send token when we make any request
我想保护 JWT token.I 已经完成了解决方案。
- 1st 我不能使用 SharedPreference 因为它不安全
敏感信息。
- 第二次我使用了 SecureStorage 包,但是当我将令牌保存在
这个 SecureStorage,我将如何进一步传递这个令牌 API
授权 需要令牌的调用。因为
SecureStorage 加密令牌。每当我尝试读取令牌时
给我那个令牌的 key 而不是实际值
JWT Token有没有其他加密解密的方法???
这里有一些问题。一种假设是您无法将机密保存在 SharedPreferences 中。这可能是正确的,但实际上取决于应用程序的上下文。
如果您请求一个短期 JWT,它可以在需要刷新之前使用一段时间,并且您正在与之通信的服务器具有适当的证明,那么 SharedPreferences 可能是安全的 足够了 - 其他应用程序没有访问权限,OS 理论上可以保证它的安全,这使得它与浏览器中的 Cookie/LocalStorage/SessionStorage 大致处于同一级别,目前用于保护大多数网络基于帐户。
现在,如果您正在做一些真正面向安全的事情(即财务、身份验证等),或者令牌是一个不会过期的刷新令牌(或类似令牌),那么可能值得更多地保护该令牌,因为您有寻求帮助。在这种情况下,有一个 bunch of plugins which could be used. FlutterSecureStorage 可能是其中最常用的,可以从您的应用程序中使用它来通过 iOS 上的钥匙串和 android 上的密钥库来保护数据。不过,在您使用它之前,您应该阅读 并理解 插件中的每一行代码 - 否则您只是盲目地将您的应用程序的安全性信任给互联网上的陌生人。
也就是说,使用它应该是这样的:
// probably want to do this in your class
final _storage = FlutterSecureStorage();
final myJwt = "1b234.232ade.1234f";
// To save the value, use this:
await storage.write(key: "my-secure-jwt", value: myJwt);
...
// And later on if you need to retrieve, use this:
final myJwt = await storage.read(key: "my-secure-jwt");
请注意,您必须将 JWT 转换为 FlutterSecureStorage 可以理解的格式——很可能是字符串,因为 JWT 具有简单的字符串编码格式——然后在从存储中读取它之后对其进行解码。您必须遵守 Keychain 和 Keystore 的任何警告 - 即设备必须解锁,您的应用程序可能需要打开,并且它在 android 的超旧版本上不可用。我不相信该插件会对此进行详细介绍,因此您最好直接阅读钥匙串和密钥库的文档。
现在,如果您的应用程序非常注重安全性,即使是上述内容对您来说可能还不够 - 毕竟,用户可能使用不安全的系统密码或个人识别码而不是使用生物识别技术登录。在这种情况下,您实际上可以更进一步,要求他们在您的应用程序打开时输入新的 pin/pattern 或生物识别信息。我见过的许多 banking/stock/etc 应用程序都这样做。我将忽略 pin/pattern 内容,因为这超出了本次讨论的范围,因为它涉及很多容易搞砸的细节。
然而,有一个用于生物识别的 plugin,您可以使用它 - 但老实说,如果您的应用程序需要如此安全,我实际上建议您自己编写本机代码,或者在使用插件之前,至少要仔细阅读插件的每一行——毕竟,再一次,通过使用它,你会将你的应用程序和用户的安全委托给互联网上的陌生人。实现和理解它的最佳资源是 android 和 ios 文档 - 它不是 super 简单但也没有那么复杂,并且会给你很多更好地了解您正在实施应用程序的系统的实际安全性。
查看此库以保存数据
Hive
这个库简单易用,实用
Write and read example
我想保护 JWT token.I 已经完成了解决方案。
- 1st 我不能使用 SharedPreference 因为它不安全 敏感信息。
- 第二次我使用了 SecureStorage 包,但是当我将令牌保存在
这个 SecureStorage,我将如何进一步传递这个令牌 API
授权 需要令牌的调用。因为
SecureStorage 加密令牌。每当我尝试读取令牌时 给我那个令牌的 key 而不是实际值
JWT Token有没有其他加密解密的方法???
这里有一些问题。一种假设是您无法将机密保存在 SharedPreferences 中。这可能是正确的,但实际上取决于应用程序的上下文。
如果您请求一个短期 JWT,它可以在需要刷新之前使用一段时间,并且您正在与之通信的服务器具有适当的证明,那么 SharedPreferences 可能是安全的 足够了 - 其他应用程序没有访问权限,OS 理论上可以保证它的安全,这使得它与浏览器中的 Cookie/LocalStorage/SessionStorage 大致处于同一级别,目前用于保护大多数网络基于帐户。
现在,如果您正在做一些真正面向安全的事情(即财务、身份验证等),或者令牌是一个不会过期的刷新令牌(或类似令牌),那么可能值得更多地保护该令牌,因为您有寻求帮助。在这种情况下,有一个 bunch of plugins which could be used. FlutterSecureStorage 可能是其中最常用的,可以从您的应用程序中使用它来通过 iOS 上的钥匙串和 android 上的密钥库来保护数据。不过,在您使用它之前,您应该阅读 并理解 插件中的每一行代码 - 否则您只是盲目地将您的应用程序的安全性信任给互联网上的陌生人。
也就是说,使用它应该是这样的:
// probably want to do this in your class
final _storage = FlutterSecureStorage();
final myJwt = "1b234.232ade.1234f";
// To save the value, use this:
await storage.write(key: "my-secure-jwt", value: myJwt);
...
// And later on if you need to retrieve, use this:
final myJwt = await storage.read(key: "my-secure-jwt");
请注意,您必须将 JWT 转换为 FlutterSecureStorage 可以理解的格式——很可能是字符串,因为 JWT 具有简单的字符串编码格式——然后在从存储中读取它之后对其进行解码。您必须遵守 Keychain 和 Keystore 的任何警告 - 即设备必须解锁,您的应用程序可能需要打开,并且它在 android 的超旧版本上不可用。我不相信该插件会对此进行详细介绍,因此您最好直接阅读钥匙串和密钥库的文档。
现在,如果您的应用程序非常注重安全性,即使是上述内容对您来说可能还不够 - 毕竟,用户可能使用不安全的系统密码或个人识别码而不是使用生物识别技术登录。在这种情况下,您实际上可以更进一步,要求他们在您的应用程序打开时输入新的 pin/pattern 或生物识别信息。我见过的许多 banking/stock/etc 应用程序都这样做。我将忽略 pin/pattern 内容,因为这超出了本次讨论的范围,因为它涉及很多容易搞砸的细节。
然而,有一个用于生物识别的 plugin,您可以使用它 - 但老实说,如果您的应用程序需要如此安全,我实际上建议您自己编写本机代码,或者在使用插件之前,至少要仔细阅读插件的每一行——毕竟,再一次,通过使用它,你会将你的应用程序和用户的安全委托给互联网上的陌生人。实现和理解它的最佳资源是 android 和 ios 文档 - 它不是 super 简单但也没有那么复杂,并且会给你很多更好地了解您正在实施应用程序的系统的实际安全性。
查看此库以保存数据 Hive 这个库简单易用,实用 Write and read example