.Net 服务器应用程序是否有任何与存储和检索敏感的每个用户信息(例如第 3 方凭据)相关的引用模式?
我的初步设计思路是这样的:
我的要求是:
更新
3. 忘了提到能够定期更新 key 是一项要求,因此相同的私有(private)加密 key 不会在 10 年内使用。
问题:
更新
再考虑一下操作系统的危害,我意识到如果熟练的攻击者获得访问权限,则无能为力,但应保护 key 免受恶意管理员的侵害,即不仅仅是打开文件或注册表项来提取私钥的问题.
我确信这个问题已经被解决了一千次,非常高兴获得链接答案,但是搜索“安全加密”类型的主题是低信号高噪音。
最佳答案
我不知道有关 .NET 服务器应用程序信息安全性的任何特定设计模式,但是,最终,您只能做很多事情来保护您向用户请求的任何信息,特别是存储的信息。
如果您要存储将用于您自己的应用程序将执行的身份验证的任何用户密码,那么存储它的最佳方法是使用加盐单向哈希函数。这样,用户将在每次向您的应用程序进行身份验证时以纯文本形式手动提供密码,您将立即对该纯文本密码进行哈希处理,并将其与您存储的哈希密码进行比较。任何攻击者,即使是有权访问原始数据库的攻击者,都必须对所有加盐哈希进行暴力逆向工程。并非不可能(考虑到足够的计算能力),但在所有现实中肯定是不可能的。
如果您要存储用户提供给您的用户名/密码,以便您的应用程序可以使用这些凭据自动代表用户“登录”/“验证”另一个应用程序或服务,我会建议如果数据的安全性至关重要,您就不会这样做。
简而言之,即使您最终加密了这些凭证(无论是对称加密还是非对称加密),这些数据也必须在某处使用,并且为了实现这一点,它需要被解密。这可以说是安全链中的“薄弱环节”。
Reduce the risk of user's sensitive information getting compromised if the .Net server's host operating system, in this case Window's Data Center Edition, is compromised.
如果发生这种情况,所有赌注都将取消。以加密形式存储数据不再意味着任何事情,就像 Windows 可以解密该数据一样,攻击者一旦可以访问机器/操作系统也可以解密。他甚至不需要尝试从 Windows 证书存储中“导出”私钥,因为他可以将恶意代码进一步注入(inject)解密链,并在解密过程中截获解密数据。
当然,保护用户敏感数据的最佳方式是根本不存储它。每次都向用户索取,将其用于您需要的任何目的,然后立即丢弃。在英国,PCI (Payment Card Industry) Data Standards对 CVV 采用此政策信用卡上的代码。商家可以存储信用卡号,但不能将 CVV 代码存储在他们的数据库中。
如果您必须存储数据,那么一定要加密它,但请注意,加密它并不一定“保护”数据,它只是增加了另一层有效混淆了可能危及您的物理机器的攻击者或操作系统。
如果您要存储数据,则必须尽可能地拥有强大的外围安全性(即 Network security),以防止攻击者获得对服务器操作系统的访问权限。
Export the certificate and key and store them on a USB key which will be locked in a treasure chest and guarded by dragons,
以及坚固的防火墙,也许还有 IDS系统,您可能也想获得其中一条龙来保护您的服务器! :)
关于.Net 设计模式,用于存储和检索每个用户的敏感数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581814/