加密外部密钥值缓存存储中的密钥和值



我正在外部键值存储中存储一些数据。此数据用作缓存。由于数据的性质,我们需要对密钥和值进行加密/散列。我们使用DataProtectionAPI进行加密和解密,使用默认算法(AES-256-CBC(。据我所知,在这种算法中,对相同明文的加密不会给你相同的密文,所以我不能加密密钥,因为下次我将没有相同的加密密钥来查找。

如果我们对密钥进行散列(使用SHA-256(而不是加密,我们实际上可以解决这个问题,但在一些罕见的情况下,散列可能会导致冲突,在我们的应用程序中,由于数据的性质,我们甚至无法承受单次冲突。代码示例:

public class MyClass 
{
IDataProtector dataProtector;
ISomeStore externalStore;
public MyClass(IDataProtectionProvider dataProtectionProvider, ISomeStore externalStore) 
{
this.dataProtector = dataProtectionProvider.CreateProtector("somePurposeString");
this.externalStore = externalStore;
}
public string GetOrAddValue(string someKey)
{
string encryptedKey = this.dataProtector.Protect(someKey);
if (this.externalStore.KeyExists(encryptedKey)
{
string encryptedValue = this.externalStore.Get(encryptedKey); // lookUp in the cache
return this.dataProtector.Unprotect(encryptedValue);
}
else
{
string someValue = GetValue(someKey);
this.externalStore.Set(encryptedKey, this.dataProtect.Protect(someValue)); // setting the value in the cache
return someValue;
}
}
}

有没有办法有效地解决这个问题?来自外部键值存储的平均查找时间约为100毫秒。

我不知道您的数据大小。但是您可以通过这种方式使用哈希来将碰撞的几率降低到0。

  1. 在将原始密钥存储到外部存储之前对其进行哈希
  2. 您可以将值调整为key:value的字典,其中key是原始键,value是原始值
  3. 在将值存储到存储区之前对其进行加密(现在是字典(
  4. 下次以后,当您想进行查找时。首先对原始密钥进行散列运算,然后检查是否匹配。如果匹配,则解密字典值并在字典中查找原始密钥。如果匹配那么好。如果找不到原始密钥,则将新密钥和值附加到此字典中,然后再次加密整个字典并将其存储在您的存储中

这将碰撞减少到0,但这将增加有效载荷大小,这在您的情况下可能是不需要的。

最新更新