4

我目前正在构建一个使用密码学的 Windows 应用商店应用程序。这意味着CryptographicBuffer该类的广泛使用。该应用程序对安全性非常敏感,因此我想确保Buffer在使用后立即将任何 's 归零。byte[]当我使用 's 时,我也在做同样的事情。

要将它们归零,目前我们希望:

  • 写全 1。
  • 写一个图案。当前使用 0,1,2,...254,255,0,1...
  • 写全 0。

我想出的解决方案是为每个创建一个扩展方法,IBufferbyte[]将为我做这件事。因为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.CopyToand IBuffer.AsStream,它们使您可以直接访问Bufferor 底层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实际上并没有很好地宣传)可以使这更容易/更有效/更安全?

注意:我意识到归零过程可能有点矫枉过正,但它是所有者要求的。

4

0 回答 0