【问题标题】:.Net Design pattern for storing and retrieving sensitive per user data.Net 设计模式,用于存储和检索每个用户的敏感数据
【发布时间】:2010-12-07 14:20:59
【问题描述】:

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

我的初步设计思路是:

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

我的要求是:

  1. 尽可能降低存储介质受损时用户敏感信息受损的风险。就我而言,存储介质可以是关系数据库或 Amazon 的 SimpleDB,
  2. 如果 .Net 服务器的主机操作系统(在本例中为 Window 的数据中心版)受到威胁,则降低用户敏感信息受到威胁的风险。

更新 3. 忘了提到能够定期更新密钥是一项要求,因此同一个私有加密密钥不会在 10 年内使用。

问题:

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

更新 再考虑一下操作系统的危害,我意识到如果熟练的攻击者获得访问权限,则无能为力,但应保护密钥免受恶意管理员的侵害,即不仅仅是打开文件或注册表项以提取私钥的问题.

我确定这个问题已经解决了一千次了,非常高兴获得链接答案,但是搜索“安全加密”类型的主题是低信号高噪音。

【问题讨论】:

    标签: .net security design-patterns encryption


    【解决方案1】:

    除了您自己提出的建议和其他一些海报之外,您还可以考虑隔离数据库检索和修改的安全性。如果一个帐户被盗用,另一个帐户是安全的。

    【讨论】:

      【解决方案2】:

      我不知道任何关于 .NET 服务器应用程序信息安全性的特定设计模式,但是,最终,您只能做很多事情来保护您从用户,特别是 store

      如果您存储任何将用于您自己的应用程序将执行的身份验证的用户密码,存储它的最佳方法是使用加盐单向哈希函数。这样,用户将在每次向您的应用程序进行身份验证时手动以纯文本形式提供密码,您将立即对该纯文本密码进行哈希处理,并将其与您存储的哈希密码进行比较。任何攻击者,即使是有权访问原始数据库的攻击者,都必须对所有加盐哈希进行暴力逆向工程。并非不可能(考虑到足够的计算能力),但在所有现实中肯定是不可能的。

      如果您要存储用户提供给您的用户名/密码,以便您的应用程序可以使用这些凭据自动代表用户“登录”/“验证”另一个应用程序或服务,那么,如果数据的安全性至关重要,我建议您不要这样做。

      简而言之,即使您最终加密了这些凭据(无论是对称加密还是非对称加密),这些数据也必须在某处使用,而要实现这一点,它也需要解密。这可以说是安全链中的“薄弱环节”。

      降低用户敏感的风险 如果 .Net 服务器的主机操作系统, 在这种情况下是 Window 的数据中心 版本,已被泄露。

      如果发生这种情况,所有赌注都将取消。以加密形式存储数据不再意味着任何事情,就像 Windows 可以解密该数据一样,攻击者一旦可以访问机器/操作系统也可以解密。他甚至不需要尝试从 Windows 证书存储中“导出”私钥,因为他可以将恶意代码进一步注入解密链,并在解密过程中截获解密数据。

      当然,保护用户敏感数据的最佳方式是根本不存储它。每次都向用户索取,将其用于您需要的任何目的,然后立即丢弃。在英国,PCI (Payment Card Industry) Data Standards 对信用卡上的CVV 代码采用此政策。商家可以存储信用卡号,但不能将 CVV 代码存储在他们的数据库中。

      如果您必须存储数据,那么一定要对其进行加密,但请注意,加密并不一定“保护”数据,它只是增加了另一层有效的混淆适用于可能危害您的物理机器或操作系统的攻击者。

      如果您要存储数据,则必须尽可能地拥有强大的外围安全(即Network security),以防止攻击者获得访问服务器的操作系统。

      导出证书和密钥 将它们存储在 USB 密钥上 锁在宝箱里,被看守着 由龙,

      除了坚固的防火墙和IDS 系统之外,您可能还希望获得其中一条龙来保护您的服务器! :)

      【讨论】:

        【解决方案3】:

        我不知道最好的解决方案是什么,但这是我在一些视频游戏中看到的,尤其是 Steam 上的游戏。游戏将首先使用通常的私钥技术进行身份验证。然后,游戏将下载一个在本地运行的脚本。然后该脚本将以某种方式检查托管它的可执行文件。该脚本可以检查可执行文件是同一个游戏还是被修改过。该脚本将在游戏开始前调用 home。如果脚本没有调用 home,则游戏服务器将游戏踢出。

        恶意软件编写者必须以某种方式欺骗脚本,使其认为它是游戏。每当发现恶意软件执行此操作时,开发人员都会更改脚本。这确保了游戏公司能够在野外停用恶意软件。

        您可以将类似的技术应用到您的应用程序中。

        【讨论】:

          猜你喜欢
          • 2021-03-27
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 2023-02-16
          • 2011-08-15
          • 2012-05-10
          • 1970-01-01
          相关资源
          最近更新 更多