Security Akavache安全覆盖不工作

Security Akavache安全覆盖不工作,security,caching,xamarin,akavache,Security,Caching,Xamarin,Akavache,正如您所知,akavache在iOS和Android上的安全存储存在问题。 我试图覆盖Akavache使用的安全存储 我一直遵循Kent给出的示例来解决这个问题: 注意:我不能在我的代码中使用System.Security.Cryptography,因为我们使用的是PCL。因此,我使用的是PCLCrypto 我使用设置类初始化DI: IPasswordProtectedEncryptionProvider providerInstance = new PasswordProtectedEncr

正如您所知,akavache在iOS和Android上的安全存储存在问题。 我试图覆盖Akavache使用的安全存储

我一直遵循Kent给出的示例来解决这个问题:

注意:我不能在我的代码中使用
System.Security.Cryptography
,因为我们使用的是PCL。因此,我使用的是
PCLCrypto

我使用设置类初始化DI:

IPasswordProtectedEncryptionProvider providerInstance = new PasswordProtectedEncryptionProvider();
providerInstance.SetPassword("test");
Splat.Locator.CurrentMutable.Register(() => providerInstance, typeof(Akavache.IEncryptionProvider));
Container.RegisterSingleton<ICache>(new CacheManager());
IPasswordProtectedEncryptionProvider providerInstance=新密码ProtectedEncryptionProvider();
providerInstance.SetPassword(“测试”);
Splat.Locator.CurrentMutable.Register(()=>providerInstance,typeof(Akavache.encyryptionProvider));
RegisterSingleton(新的CacheManager());
我使用
PasswordProtectedEncryptionProvider
作为我的
IEncryptionProvider
的自定义覆盖。但是类中重写的方法,
DecryptBlock
EncryptBlock
,不会被调用

不明白为什么没人叫它


提供程序实例是否会覆盖它?

根据注册的时间和获取安全缓存的方式,它可能会被后进先出

为了避免歧义(对于更干净的DI),我通常按如下方式设置加密缓存:

var fsprovider = Locator.Current.GetService<IFilesystemProvider>();

var root = fsprovider.GetDefaultSecretCacheDirectory();
var dbName = "mysecrets.db";        
var path = Path.Combine(root, dbName);

var encryptionProvider = /* create + init or resolve your enc provider here */

var encryptedCache = new SQLiteEncryptedBlobCache(path, encryptionProvider);
var fsprovider=Locator.Current.GetService();
var root=fsprovider.GetDefaultSecretCacheDirectory();
var dbName=“mysecrets.db”;
var path=path.Combine(root,dbName);
var encryptionProvider=/*在此处创建+init或解析您的enc提供程序*/
var encryptedCache=新的SQLiteEncryptedBlobCache(路径,encryptionProvider);
要解决您的特定问题,请在DI之前初始化缓存管理器:

CacheManager _cache = new CacheManager();

IPasswordProtectedEncryptionProvider providerInstance = new PasswordProtectedEncryptionProvider();
providerInstance.SetPassword("test");
Splat.Locator.CurrentMutable.Register(() => providerInstance, typeof(Akavache.IEncryptionProvider));

Container.RegisterSingleton<ICache>(_cache);
CacheManager\u cache=new CacheManager();
IPasswordProtectedEncryptionProvider providerInstance=新密码ProtectedEncryptionProvider();
providerInstance.SetPassword(“测试”);
Splat.Locator.CurrentMutable.Register(()=>providerInstance,typeof(Akavache.encyryptionProvider));
容器.RegisterSingleton(_缓存);

感谢您的回复@rdavisau。当你提到后进先出问题时,你引导我找到了最终的解决方案。我将您的答案改为如何解决具体问题的示例。