C# PCL中的xamarin securestring等效项

C# PCL中的xamarin securestring等效项,c#,xamarin,dependency-injection,portable-class-library,securestring,C#,Xamarin,Dependency Injection,Portable Class Library,Securestring,SecureString对PCL不友好。我知道这个问题可以通过依赖项注入解决,但我不想这样做,而是希望在PCL中使用与SecureString等效的东西 但到目前为止,我找不到任何其他类或框架。System.Security.在任何可移植类库配置文件中都不存在。您可能会在一些更高版本的.NET标准中发现这一点,这些标准提供了更大的.NET子集 如果您坚持使用PCL,那么最好的选择是使用诸如PCLCrypto之类的库,或者在每个平台上滚动您自己的代码,并在运行时注入这些代码。您可以使用所谓的 在这

SecureString对PCL不友好。我知道这个问题可以通过依赖项注入解决,但我不想这样做,而是希望在PCL中使用与SecureString等效的东西


但到目前为止,我找不到任何其他类或框架。

System.Security.
在任何可移植类库配置文件中都不存在。您可能会在一些更高版本的.NET标准中发现这一点,这些标准提供了更大的.NET子集

如果您坚持使用PCL,那么最好的选择是使用诸如PCLCrypto之类的库,或者在每个平台上滚动您自己的代码,并在运行时注入这些代码。

您可以使用所谓的

在这种情况下,这意味着您需要创建一个强名称PCL程序集,其中包含
SecureString
的实现存根,包括您打算在应用程序中使用的
SecureString
的方法和属性

例如:

namespace System.Security {
  public class SecureString {
    public SecureString() { }
    public int Length { get; }
    public void AppendChar(char c) { }
  }
}
重要的是,您包含的属性和方法使用与原始类完全相同的签名,因为在使用此技巧时,您将依赖于签名等价性。另一方面,您不需要提供有效的实现,因为这将由每个相应平台上的内置
SecureString
处理

接下来,您需要为每个平台创建一个与PCL程序集具有相同强名称的程序集,只需包含指向
SecureString
的类型转发指令:

[assembly: TypeForwardedTo(typeof(SecureString))]
这取决于这样一个事实,即即使没有PCL配置文件定义
SecureString
,每个平台都会定义。因此,您在特定于平台的DLL中实际要做的是指出您希望用来代替PCL声明的
SecureString
的实现

PCL和特定于平台的程序集就位后,假设它们都共享相同的名称(例如securestring.dll)并使用相同的密钥签名,现在可以在实现中使用
securestring

例如,假设您有一个PCL程序集foo.Core.dll,该程序集由平台特定的应用程序foo.Windows.dll、foo.Android.dll和foo.iOS.dll使用,其中foo.Core.dll使用
SecureString
。然后,您应该这样组织您的解决方案:

  • foo.Core.dll应引用securestring.dll的PCL版本
  • foo.Windows.dll应参考foo.Core.dllsecurestring.dll的Windows版本
  • foo.Android.dll应参考foo.Core.dll安卓版本的securestring.dll
  • foo.iOS.dll应参考foo.Core.dllsecurestring.dll的iOS版本

它不应该友好,这是PCL的重点。它会阻止您在选定的某个平台目标上获取不适当或完全无效的依赖项。是的,和Xamarin一样,SecureString只有在使用pinvoke向本机代码传递密码时才是安全的。任何其他用途都是不安全的。显然,您需要向我们展示这是什么样子,以获得替代方案。PCLCrypto不提供securestring,推出我们自己的可能很容易被破坏