我目前正在构建一个使用密码学的 Windows 应用商店应用程序。这意味着CryptographicBuffer
该类的广泛使用。该应用程序对安全性非常敏感,因此我想确保Buffer
在使用后立即将任何 's 归零。byte[]
当我使用 's 时,我也在做同样的事情。
要将它们归零,目前我们希望:
- 写全 1。
- 写一个图案。当前使用 0,1,2,...254,255,0,1...
- 写全 0。
我想出的解决方案是为每个创建一个扩展方法,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
and IBuffer.AsStream
,它们使您可以直接访问Buffer
or 底层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
实际上并没有很好地宣传)可以使这更容易/更有效/更安全?
注意:我意识到归零过程可能有点矫枉过正,但它是所有者要求的。