在 Xamarin Forms 中存储密钥

Posted

技术标签:

【中文标题】在 Xamarin Forms 中存储密钥【英文标题】:Store secret key in Xamarin Forms 【发布时间】:2019-11-08 12:47:55 【问题描述】:

我试图了解如何在 xamarin 表单项目中存储机密。

我有一个 web api 核心作为后端,一个 xamarin 表单应用程序作为前端。

我正在尝试使用 Xamarin.Auth 编写 facebook 身份验证代码,我需要将密钥传递给我的应用程序..

我的想法:

    存储在前端:我可以创建一个配置文件并对其进行加密,但解密将在我的源代码中,通过反编译和反射,黑客可以检索解密源代码并解密密钥。

2:存储在后端:我可以将密钥存储在后端,但通过嗅探发送的请求,黑客可以检索我的密钥。

那么解决方法是什么?我该怎么做?

谢谢,

【问题讨论】:

存储在后端是最好的选择。使用 SSL、HSTS 策略和其他安全策略保护您的后端,以保护您的网络负载。这就是我们所能做的。 Web 服务或您的应用程序的性质将被其他人使用!门总是开着的,不然别人怎么能用你的应用呢? 【参考方案1】:

您可以使用Xamarin.Essentials 存储您的秘密。对于 android,您的密码将存储在 Androids KeyStore 中,而对于 ios,您的密码将存储在 Keychain 中。即使您决定使用加密的配置文件,我强烈建议您将密钥和 IV 存储在 SecureStorage 中,而不是在源代码中硬编码。它非常易于使用,而且与在移动设备上一样安全。

try

   // write secret
   await SecureStorage.SetAsync("oauth_token", "secret-oauth-token-value"); 

   // read secret
   var token = await SecureStorage.GetAsync("oauth_token");

catch(Exception ex)

 

【讨论】:

这种方法的问题是你仍然需要 SetAsync 所以对于一个 oauth 令牌你不会问用户那么你怎么把它放进去?如果您按照上述方式执行,它仍然存在于您的源代码中。 @Richthofen 也许在这里使用环境变量是有意义的。 @Richthofen You App 将用户定向到身份验证网站,即您的应用正在使用的相关身份验证服务,例如Auth0,Firebase,提供身份验证令牌。您将通过 SecureStorage 将这个令牌保存到磁盘 @AntonSwanevelder 我建议使用 iOS 和 Android 提供的安全存储。通常,当您提出自定义解决方案时,结果不如使用平台提供的解决方案安全。

以上是关于在 Xamarin Forms 中存储密钥的主要内容,如果未能解决你的问题,请参考以下文章

ReactiveUI 中的 Xamarin.Forms 控件是不是需要自定义绑定?

Xamarin Forms 可折叠 StackLayout

在应用程序中安全地保存密钥或字符串 - Xamarin 表单

AppCenter 崩溃和 Firebase Crashlytics - 两者都不起作用 - Xamarin.Forms iOS

Xama不会跟踪Xamarin Android新文件

设置列表视图项模板的背景颜色和列表背景颜色时,Xamarin Forms Listview 选定项背景颜色丢失