如何从内部保护系统(如内部工作)?

时间:2014-01-24 10:03:32

标签: c# sql-server asp.net-mvc database security

我在一个流行的网络托管服务中部署了一个应用程序。因为他们对自己的计算机拥有管理员权限,所以我觉得我迫切需要跨所有层保护我的数据,包括数据库本身。

在数据库上,我正在考虑加密敏感信息,如用户名和电子邮件,可能是他们的电话号码等。存储库层将处理所有编码/解码要求。

我有三个DLL:1)应用程序层(控制器和视图),2)业务层(服务逻辑)和3)数据层(存储库)。

通常,来自外部的用户会请求一个页面,如果他们尚未通过身份验证,他们将被重定向到登录页面,这是典型的表单身份验证。这可以保护系统免受外部无特权用户的侵害。

但是,在内部,从技术上讲,这些DLL可以导入到任何.NET应用程序中。在这种情况下,应用程序可以随时访问系统的内部工作。

2 个答案:

答案 0 :(得分:9)

如果数据托管在其他人拥有管理员访问权限的计算机上,则无法最终保护您的数据并仍然可以访问该数据。您使用的任何加密都将依赖于秘密,但您必须将密钥存储在盒子上,此时盒子的所有者才能访问它。

唯一可行的方法是,如果您的用户在上传之前在本地加密了数据,然后您的服务器将相同的加密数据提供给他们。但在那时,您将无法在服务器端对该数据执行任何操作。

您需要查看服务器提供商的政策,了解他们对您存储在服务器上的数据的处理方式并询问:

  1. 他们保证不查看数据吗?
  2. 您信任他们遵守此政策吗?
  3. 您是否相信他们能够保护其服务器免受入侵?
  4. 由于法律原因,他们是否必须将其数据放弃给其他人,尽管他们的政策?例如,各国政府可以让公司披露数据。
  5. 然后,您可以权衡风险并决定是否:

    1. 您对风险感到满意,但仍希望与他们一起存储敏感数据。
    2. 您的用户是否对风险感到满意 - 您需要明确告知自己的隐私政策和风险,以便他们做出明智的选择。
    3. 另外,考虑是否需要存储所有信息。你为什么需要电话号码?如果是处理付款,您可以将所有这些交给可信赖的第三方,例如Visa或Paypal。然后他们可以安全地处理用户数据的存储,而不必处理风险。

答案 1 :(得分:1)

一个好的做法是不在数据库中加密和存储密码。您应该使用随机盐(使用加密的RandomNumberGenerator类,而不是数学Random类)来对抗彩虹表攻击并仅存储哈希和盐。掌握那张桌子的人仍然很难冒充合法用户。如果您不信任DBA,甚至不要考虑存储信用卡信息。有些网络服务允许付款,无需您知道任何合理的凭据,如PayPal重定向和类似。其他敏感数据(电子邮件)应使用其他用户级数据加密,例如用户名和常量盐,如下所示:“example@email.com+username+AayRUIOH283uID”。

所有这些都只是微不足道的事情,让你的生活变得更加艰难,但也是一个不受信任的管理员的生活。还要考虑仅接受来自您自己的云群集(可信IP表)的Intranet连接,甚至在您自己的节点之间使用SSL并使用非对称密钥签署程序集文件,这样就无法替换DLL。

尽管如此,所有这些都是耗费大量时间和精力来获得可疑的安全优势。与所有方面一样,安全性不是系统的特征,而是成本/收益的折衷。

最好的选择是避开不祥的选择,寻找替代风险较低的解决方案(例如 NOT 存储密码)。请记住,有些工具可以篡改二进制文件(DLL),检查发布版本的MSIML代码(即使在没有调试符号表的情况下也可以像C#一样编译.NET)以及在应用程序运行时篡改内存的工具。有一些技术可以使内存篡改成本非常高,比如不在字符串中存储合理的数据(如密码),而是在固定的内存位置一次将它们串行一个字符并每次覆盖相同的字符,就地将哈希重新组合在一起使用增量散列算法“在运行中”(SHA-256会很好)。

但是,当管理员不受信任时,你无法真正保护自己免受各种攻击。他总是能够亲自关掉你的机器并把它带回家,在地下室玩得开心......

相关问题