Akavache 安全覆盖不起作用

Akavache security override not working

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

我一直在按照肯特给出的例子来解决这个问题: http://kent-boogaart.com/blog/password-protected-encryption-provider-for-akavache

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

我使用设置 class 来初始化 DI:

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

我使用 PasswordProtectedEncryptionProvider 作为我对 IEncryptionProvider 的自定义覆盖。然而,在 class、DecryptBlock EncryptBlock 中覆盖的方法不会被调用!

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

() => providerInstance覆盖它吗?

根据您注册的时间以及您获取安全缓存的方式,它可能会在 Akavache's default registrations 前采用后进先出法。

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