2017-05-22 3 views
1

あなたが知っているように、akavacheはiOSとAndroid上の安全なストレージに問題があります。 私はAkavacheで使用される安全なストレージを無効にしようとしています。Akavacheセキュリティオーバーライドが機能しない

私はこの問題を解決するためにケントによって与えられた例を以下してきた: http://kent-boogaart.com/blog/password-protected-encryption-provider-for-akavache

注:私たちはPCLのを使用しているので、私は、私のコードでSystem.Security.Cryptographyを使用することはできません。したがって、私はPCLCryptoを使用しています。

私はDIを初期化するために、セットアップクラスを使用します。私はIEncryptionProviderの私のカスタムオーバーライドとしてPasswordProtectedEncryptionProviderを使用

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

。ただし、クラスでオーバーライドされたメソッドDecryptBlockEncryptBlockは呼び出されません!

なぜ呼び出されていないのか分かりません。

() => providerInstanceは無効にしますか?

答えて

2

登録のタイミングと安全なキャッシュの取得方法によっては、Akavache's default registrationsでLIFOを取得している可能性があります。あいまいさを避けるために

(とクリーナーDI用)、Iは、一般的に以下のように私の暗号化されたキャッシュを設定します

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