SecureString在C#应用程序中是否可行?

SecureString在C#应用程序中是否可行?,第1张

SecureString在C#应用程序中是否可行?

实际上有非常实用的用法

SecureString

您知道我见过多少次这种情况吗?(答案是:很多!):

  • 密码意外出现在日志文件中。
  • 在某处显示密码-一旦GUI确实显示了正在运行的应用程序的命令行,并且该命令行包含密码。 哎呀
  • 使用内存分析器与您的同事一起分析软件。同事在内存中看到您的密码。听起来不真实?一点也不。
  • 我曾经使用过一种
    RedGate
    软件,该软件可以在发生异常的情况下捕获局部变量的“值”,这非常有用。不过,我可以想象它会意外记录“字符串密码”。
  • 包含字符串密码的故障转储。

您知道如何避免所有这些问题吗?

SecureString
。通常可以确保您不会犯此类愚蠢的错误。如何避免呢?通过确保在非托管内存中对密码进行加密,只有在您确定自己在做什么的90%时,才可以访问真实值。

从某种意义上说,

SecureString
很容易工作:

1)一切都加密

2)用户通话

AppendChar

3)解密“未管理的内存”中的所有内容并添加字符

4)在“未管理的内存”中再次加密所有内容。

如果用户可以访问您的计算机怎么办?病毒是否可以访问所有

SecureStrings
?是。您需要做
RtlEncryptMemory
的就是在解密内存时陷入困境,您将获得未加密内存地址的位置,并将其读出。瞧!实际上,您可能制作了一种病毒,该病毒将不断对其进行扫描
SecureString
并记录所有活动。我并不是说这将是一件容易的事,但可以做到。如您所见,
SecureString
一旦系统中存在用户/病毒,“功能”将完全消失。

您的帖子中有几点。当然,如果您使用一些内部保存有“字符串密码”的UI控件,那么使用“实际”

SecureString
并不是那么有用。虽然如此,它仍然可以防止我在上面列出的某些愚蠢行为。

另外,正如其他人指出的那样,WPF支持

SecureString
通过其
SecurePassword
属性在内部使用的PasswordBox

****

底线是;
如果您有敏感数据(密码,xyk等),请使用

SecureString
。这就是C#framework所遵循的。例如,
NetworkCredential
class将密码存储为
SecureString
。如果您查看此内容,则可以在.NET框架中看到约80多种不同的用法
SecureString

在许多情况下,您必须转换

SecureString
为字符串,因为某些API会期望它。

通常的问题是:

  1. API是通用的。它不知道有敏感数据。
  2. API知道它正在处理敏感数据,并使用“字符串”-这只是一个糟糕的设计。

您提出了一个很好的观点:

SecureString
转换为时会发生什么
string
?这只能由于第一点而发生。例如,API不知道它是敏感数据。我个人没有看到这种情况。从SecureString中获取字符串并不是那么简单。

原因不简单,原因很简单
;就像您所说的那样,从来没有打算让用户将SecureString转换为字符串:GC将启动。如果您看到自己这样做,则需要退后一步,问问自己:我为什么还要这样做,或者我真的需要这个,为什么呢?

我看到一个有趣的案例。即,WinApi函数LogonUser使用LPTSTR作为密码,这意味着您需要调用

SecureStringToGlobalAllocUnipre
。基本上,这为您提供了保存在非托管内存中的未加密密码。完成后,您需要立即删除:

// Marshal the SecureString to unmanaged memory.IntPtr rawPassword = Marshal.SecureStringToGlobalAllocUnipre(password);try{   //...snip...}finally {   // Zero-out and free the unmanaged string reference.   Marshal.ZeroFreeGlobalAllocUnipre(rawPassword);}

您始终可以

SecureString
使用扩展方法(例如)来扩展该类,该方法
ToEncryptedString(__SERVER__PUBLIC_KEY)
为您提供了使用服务器的公共密钥加密的
string
实例
SecureString
。然后只有服务器才能对其解密。解决的问题:垃圾回收将永远不会看到“原始”字符串,因为您永远不会在托管内存中公开它。这正是
PSRemotingCryptoHelper
EncryptSecureStringCore(SecureStringsecureString)
)中所做的。

并且作为一个几乎与之相关的东西: Mono SecureString根本不加密
。该实现已被注释掉,因为..等待它。“它以某种方式导致nunit测试损坏”,这引出了我的最后一点:

SecureString
到处都不支持。如果平台/体系结构不支持
SecureString
,您将得到一个例外。文档中有受支持的平台列表。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5440847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存