我有一个用 Xamarin 编写的应用程序,它使用 SecureStorage.SetAsync 保存数据。现在我需要将应用程序转换为原生 Kotlin 和 Swift 项目。 Xamarin 将数据存储在 iOS 钥匙串中,检索起来相对简单。但是我正在努力检索 Kotlin Android 中的数据,因为我相信我需要找到密钥并手动解密数据。
如何在 Android 中检索数据?
根据官方文档Platform Implementation Specifics of the SecureStorage API,它使用android native api Shared Preferences来存储数据。
Android KeyStore 用于存储用于加密值的密码密钥,然后将其保存到文件名为 [YOUR-APP-PACKAGE-ID].xamarinessentials 的共享首选项中。共享首选项文件中使用的密钥(不是加密密钥,值的密钥)是传递到 SecureStorage API 的密钥的 MD5 哈希。
所以我试过这个
SecureStorage.SetAsync("test", "hahaha");
。然后我搜索了共享首选项文件的android默认位置,它在/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME.xamarinessentials.xml
.
我用 Android Studio 的设备文件资源管理器检查了文件:
值已经加密,可以查看加密字符串的源码。此外,您可以查看源代码了解它是如何使用共享首选项的
var sharedPreferences = GetSharedPreferences(sharedName)
。 sharedName 是 SecureStorage 类中的string Alias = $"{AppInfo.PackageName}.xamarinessentials"
.
所以我使用android原生api读取共享首选项文件:
var name = this.PackageName + ".xamarinessentials";
var sp = GetSharedPreferences(name, FileCreationMode.Private);
var value = sp.GetString("test",null);
调试结果:
该值是加密的,需要根据加密字符串的源码进行解密。因此,您只需将三行 c# 代码转换为 kotlin 代码即可获取值。
另外,如果你想将xamarin app转为Android Kotlin app,可以直接使用native SharedPreferences api。我不明白为什么你需要 Retrieve Xamarin secure storage data from native Kotlin Android.