.Net 设计模式,用于存储和检索每个用户的敏感数据

标签 .net security design-patterns encryption

.Net 服务器应用程序是否有任何与存储和检索敏感的每个用户信息(例如第 3 方凭据)相关的引用模式?

我的初步设计思路是这样的:

  • 使用适当强的私钥生成自签名 X509 证书
  • 将证书和 key 导出并存储在 U 盘上,U 盘将被锁在宝箱中,由巨龙守护,
  • 设计我的服务器应用程序以根据需要从 windows 当前用户证书存储区请求私钥,
  • 在新服务器上安装服务器应用程序时,检索 USB key 并导入证书并将私钥标记为不可导出。

  • 我的要求是:
  • 尽可能降低存储介质泄露时用户敏感信息泄露的风险。在我的情况下,存储介质可以是关系数据库或 Amazon 的 SimpleDB,
  • 如果 .Net 服务器的主机操作系统(在本例中为 Window 的数据中心版)受到损害,则降低用户敏感信息受到损害的风险。

  • 更新
    3. 忘了提到能够定期更新 key 是一项要求,因此相同的私有(private)加密 key 不会在 10 年内使用。

    问题:
  • 如果主机操作系统受到威胁,攻击者可以安装恶意应用程序来执行与我的 .Net 服务器相同的解密操作。

  • 更新
    再考虑一下操作系统的危害,我意识到如果熟练的攻击者获得访问权限,则无能为力,但应保护 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 StandardsCVV 采用此政策信用卡上的代码。商家可以存储信用卡号,但不能将 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/

    相关文章:

    sql - 在 Doctrine 中手动转义

    c# - 如何在内存中创建Xml文件上传到服务器

    java - 如何在 Java 中查找 Cipher 是否需要 IV?

    c# - 获取带有对象数组的 ArrayTypeMismatchException

    security - Indy HTTP 服务器是否有内置方法来为某些文件/扩展分配安全性?

    design-patterns - 如何重构执行多个步骤(相互依赖)的方法?

    node.js - 数据库客户端抽象

    java - java中的类设计(设计模式)思想?

    C#.Net UdpClient 接收事件

    c# - 在没有 .NET 框架的情况下运行 .NET 应用程序