我目前正在构建一个使用加密技术的Windows应用商店应用。这意味着广泛使用CryptographicBuffer
类。该应用程序对安全性非常敏感,因此我想确保在使用后立即将任何Buffer
清零。我在使用byte[]
时会做同样的事情。
要将它们归零,目前我们想:
我提出的解决方案是为IBuffer
和byte[]
创建一个扩展方法,它将为我执行此操作。对于byte[]
我认为这很简单:
public static void Zeroize(this byte[] bytes)
{
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = 255;
}
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = (byte)(i % 255);
}
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = 0;
}
}
对于IBuffer
,这有点困难,因为您似乎无法直接访问Buffer
。通过System.Runtime.InteropServices.WindowsRuntime;
,您似乎可以获得一些有用的方法,例如IBuffer.CopyTo
和IBuffer.AsStream
,这些方法可让您直接访问Buffer
或基础Stream
。我提出的解决方案是:
public static void Zeroize(this IBuffer buffer)
{
var capacity = buffer.Capacity;
byte[] toWrite = new byte[capacity];
for (int i = 0; i < capacity; i++)
{
toWrite[i] = 255;
}
toWrite.AsBuffer().CopyTo(buffer);
for (int i = 0; i < capacity; i++)
{
toWrite[i] = (byte)(i % 255);
}
toWrite.AsBuffer().CopyTo(buffer);
for (int i = 0; i < capacity; i++)
{
toWrite[i] = 0;
}
toWrite.AsBuffer().CopyTo(buffer);
}
我的问题是:有没有更好的方法来做到这一点?是否有任何其他隐藏方法(InteropServices
并未真正做广告宣传)会使这更方便/更有效/更安全?
注意:我意识到归零过程可能过度,但业主要求它。