Windows.Security.Cryptography生成的IBuffer对象应该如何安全管理?
How should IBuffer objects generated through Windows.Security.Cryptography be managed securely?
继我之前的问题之后:
IBuffer 对象由 WinRT 中的加密例程返回和使用。正如我之前的问题得到了回答,这些缓冲区的任何安全管理都必须由用户维护——例如覆盖内存,在不需要时加密等。但是,与 IBuffers 底层数据交互的方法在 C# 级别受到限制。
那么,C#开发者如何正确管理这些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。你当然可以使用不同的您选择的价值 :-).
继我之前的问题之后:
IBuffer 对象由 WinRT 中的加密例程返回和使用。正如我之前的问题得到了回答,这些缓冲区的任何安全管理都必须由用户维护——例如覆盖内存,在不需要时加密等。但是,与 IBuffers 底层数据交互的方法在 C# 级别受到限制。
那么,C#开发者如何正确管理这些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。你当然可以使用不同的您选择的价值 :-).