使用Base64编码的安全方式将字节数组转换为SecureString

3

我有一个 byte[] 需要使用Base64进行编码并返回SecureString。我目前的代码如下:

        string privateString = Convert.ToBase64String(byteArray);
        SecureString result = new SecureString();
        foreach (char c in privateString)
        {
            result.AppendChar(c);
        }
        // wipe the byte array...

问题在于调用Convert.ToBase64String不安全,因为它会创建一个我无法销毁的托管字符串。 有没有一种安全的方法可以做到这一点?

1
微软不建议使用SecureString https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md 它在他们的文档中提到了 https://learn.microsoft.com/en-us/dotnet/api/system.security.securestring?view=netframework-4.8 - Access Denied
1
不。事实上,你在内存中有一个托管的byteArray,其中包含未加密的内容,这个内容可能会被GC移动或通过快照泄漏,这已经意味着涉及到SecureString几乎没有任何意义。它非常难以有效地使用,通常你不应该费心去使用,因为所提供的安全性是虚幻的。 - Jeroen Mostert
@JeroenMostert,拥有一个byte[]比拥有一个string更有用,因为你至少可以在完成后覆盖它(而不需要诉诸于unsafe黑客技术)。但是,确实同意使用SecureString等。 - Marc Gravell
1
@MarcGravell: 确实如此,但问题就变成了“你从哪里得到了那个byte[]?”除非它是从虚无中创建的或者是从一个加密 RNG 调用中创建的,并确保跟踪了所有缓冲区,否则很可能涉及到另一个路径,在这个路径上复制了内存。狭窄的门通向SecureString,而通向不安全数据副本的道路则很宽...(在考虑到从SecureString出去的路径之前,当然还有这个主要原因,这个东西并不真正起作用。) - Jeroen Mostert
1个回答

1
关于不使用中间字符串对Base-64数据进行编码的方法: System.Buffers.Text.Base64。然而!SecureString并不安全,基本上现在不应该使用它。 它不能对任何有意义的攻击提供任何有用的保护。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接