1

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

我一直在按照肯特给出的例子来解决这个问题: 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());

PasswordProtectedEncryptionProvider用作我的自定义覆盖IEncryptionProvider。但是,在类中重写的方法DecryptBlock EncryptBlock,不会被调用!

不明白为什么它没有被调用。

() => providerInstance覆盖它吗?

4

1 回答 1

2

根据您注册的时间以及您获取安全缓存的方式,它可能会被Akavache 的默认注册获取 LIFO 。

为了避免歧义(以及更清晰的 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);
于 2017-05-22T11:40:00.320 回答