对于我正在处理的程序,我得到的一个特性请求是能够保存用户输入的凭据列表,这样就可以在周围共享它们。激发这一请求的具体用例是在一个大型企业网络上使用我们的程序,该网络由一个由片状广域网连接的相当好的局域网组成。这个想法是,我们的程序没有在WAN关闭时击败它,而是发送一个包含严密保护的管理凭证的“配置”文件,在每个LAN中运行它,并压缩结果并将其发送回电子邮件。
嗯。
我最初的本能是嘲笑这个请求-保存密码?真的?当然,该公司的网络部门希望你能尝试销售他们所有的广域网产品--但事实证明,我使用凭证的其中一个类别可以使用SecureString,而且,好吧,总是想办法节省人们的精力。这让我不禁纳闷:
是否可以保存加密的SecureString,以便将敏感数据保存到文件中并在其他地方打开?
你是怎么想的,堆栈溢出?
发布于 2008-09-29 07:06:37
在SecureString中不支持保存,它是一种保护内存托管字符串的机制,只用于与非托管API进行接口。如果密码存储在System.String实例中,由于System.String的性质,安全性会降低。垃圾收集和实习生的存在会使密码在内存中的保存时间超过必要时间。另外,由于.NET的调试工具太多,即使没有更长的生存期,通过反射或另一个.NET API访问字符串也要容易得多。
如果您要在磁盘上保存密码,那么您的安全性就严重受损。如果有人可以对机器进行物理访问,或者管理员级远程访问,那么您所能做的最好就是让它变得更加困难,但绝不是不可能的。使用加密API,将其存储在安全的位置,配置访问权限。
抛开所有这些,Merus,我建议您尝试改进整个系统,因为对于像您所描述的用例(假设我理解它),存储哈希比实际密码更好。
发布于 2008-11-25 15:23:05
您可能需要查看比较密码哈希。
您将有一个由用户名和其他常量组成的盐类,后面是字符串。然后,将其传递给哈希算法,如SHA1 1*。
例如,
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);
}然后,将GetPasswordHash(username, expectedPassword, salt)的结果与GetPasswordHash(username, givenPassword, salt)进行比较。
如果使用用户名和密码实现自己的用户列表,则可能只考虑保存哈希(GetPasswordHash(username, givenPassword, salt))并与保存的哈希进行比较。
发布于 2008-09-29 06:45:07
如果您的意思是保存SecureString的加密字节,那么这将不起作用-SecureString的密钥与用户和进程绑定在一起。在不同的进程或为不同的用户读取这些字节,并且无法解密字符串。
https://stackoverflow.com/questions/147726
复制相似问题