应该如何安全地管理通过Windows.Security.Cryptography生成的IBuffer对象

本文关键字:Cryptography Security Windows 对象 IBuffer 管理 何安全 安全 | 更新日期: 2023-09-27 18:20:07

继我之前的问题之后:Windows.Security.Cryptographic.CryptographicBuffer中的方法生成的IBuffer对象是否具有安全功能?

IBuffer对象由WinRT中的加密例程返回和使用。正如我之前的问题所回答的那样,这些缓冲区的任何安全管理都必须由用户维护——例如,覆盖内存,在不需要的时候进行加密等。然而,与IBuffer底层数据交互的方法仅限于C#级别。

那么,C#开发人员如何正确地管理这些IBuffer中的敏感数据呢?

应该如何安全地管理通过Windows.Security.Cryptography生成的IBuffer对象

如果您喜欢,即使使用C#,也可以在使用后擦除缓冲区。这里有一个方便的助手:

public static class BufferExtensions
{
  public async static Task ClearContentsAsync(this IBuffer buff)
  {
    var writer = new DataWriter(buff.AsStream().AsOutputStream());
    for (var i = 0; i < buff.Capacity; i++)
      writer.WriteByte(42);
    await writer.StoreAsync();
  }
}

这样使用:

  var buff = CryptographicBuffer.GenerateRandom(20);
  var before = buff.ToArray();
  await buff.ClearContentsAsync();
  var after = buff.ToArray();
  Debug.WriteLine("{0},{1},{2} - {3},{4},{5}", 
    before[0], before[1], before[2], after[0], after[1], after[2]);

注意,before(清除前的副本)中的值是随机的,但after(清除后的副本)的值都是42。当然,您可以使用自己选择的不同值:-)。