保存SecureString

Mer*_*rus 7 .net securestring

我正在处理的程序的一个功能请求是能够保存用户输入的凭据列表,以便可以共享它们.启发此请求的特定用例是在大型企业网络上使用我们的程序,该网络由相当好的LAN组成,这些LAN通过片状WAN连接.我们的想法是,不是让我们的程序在WAN关闭时击败WAN,而是发送一个包含严密保护的管理员凭据的"配置"文件,在每个局域网中运行并压缩结果并通过电子邮件发送给它背部.

是啊.

我最初的本能是嘲笑这个请求 - 保存密码?真?当然,公司的网络部门更愿意尝试销售他们拥有的任何广域网产品 - 但事实证明我使用凭证的其中一个类可以采用SecureString,而且,总是很好的关注你可以节省一些人的努力.这让我想知道:

是否可以保存加密的SecureString,以便我可以将敏感数据保存到文件中并在其他地方打开?

您有什么想法,Stack Overflow?

ned*_*uod 5

SecureString中没有保存支持,它旨在作为保护内存中托管字符串的机制,仅用于与非托管API进行交互.如果密码存储在System.String实例中,则由于System.String的性质,安全性会降低.垃圾收集和实习的存在会使密码在内存中的时间超过必要的时间.同样由于.NET的大量调试工具,通过反射或其他.NET API访问字符串会更加容易,即使没有更长的生命周期.

如果您要在磁盘上保存密码,那么您的安全性就会受到很大影响.如果有人可以物理访问机器或管理员级远程访问,那么您可以做的最好的事情就是让它变得更加困难,但绝不可能.使用加密API,将其存储在安全位置,配置访问权限.

除此之外,Merus,我建议你尝试改进整个系统,因为对于你正在描述的用例(假设我理解它),你最好存储哈希而不是实际的密码.

  • 我希望 SecureString 能为我做哈希。我知道最好不要推出自己的哈希函数。 (2认同)

con*_*tor 5

您可能想看看比较密码哈希。
您将有一个由用户名和可能其他一些常量组成的盐,后跟字符串。然后,您可以将其传递给哈希算法,例如 SHA1*。
例如,

using System.Security.Cryptography;

public byte[] GetPasswordHash(string username, string password, string salt)
{
    // get salted byte[] buffer, containing username, password and some (constant) salt
    byte[] buffer;
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write(salt);
        writer.Write(username);
        writer.Write(password);
        writer.Flush();

        buffer = stream.ToArray();
    }

    // create a hash
    SHA1 sha1 = SHA1.Create();
    return sha1.ComputeHash(buffer);
}
Run Code Online (Sandbox Code Playgroud)

然后,您将比较结果GetPasswordHash(username, expectedPassword, salt)GetPasswordHash(username, givenPassword, salt)
如果您使用用户名和密码实现自己的用户列表,您可能会考虑仅保存哈希值 ( GetPasswordHash(username, givenPassword, salt)) 并与保存的哈希值进行比较。