2017-05-22 69 views
1

如您所知,akavache在其iOS和Android上的安全存储方面存在问题。 我想覆盖Akavache使用的安全存储。Akavache安全覆盖不起作用

我一直在下面由Kent给出解决这个问题的例子: http://kent-boogaart.com/blog/password-protected-encryption-provider-for-akavache

注:我不能在我的代码中使用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()); 

我用PasswordProtectedEncryptionProviderIEncryptionProvider我的自定义替代。但是在类中覆盖的方法DecryptBlockEncryptBlock不会被调用!

不明白为什么它不被称为。

是不是() => providerInstance重写它?

回答

2

根据您注册的时间和您获得安全缓存的方式,它可能会由Akavache's default registrations获得LIFO'd。

为了避免歧义(和更清洁的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); 

解决您的具体问题,提前DI的初始化高速缓存管理器:

CacheManager _cache = new CacheManager(); 

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

Container.RegisterSingleton<ICache>(_cache); 
+0

谢谢你的回复@rdavisau。当您提到LIFO问题时,您会引导我到最后的解决方案。我改变了你的答案,例如如何解决具体问题。 – cfl