C# ASP.net在上载/解密到用户后加密文件

C# ASP.net在上载/解密到用户后加密文件,c#,asp.net,vb.net,security,encryption,C#,Asp.net,Vb.net,Security,Encryption,我正在研究和开发一个可能的项目,我的潜在客户正在与我讨论 我正在考虑创建一个asp.NET4.5Web应用程序,它将通过web访问并保存一些非常敏感的信息。这些信息将通过webApp和存储在服务器上的文件上传,以便以后查看/检索。我想确保信息安全地上传和存储。为了做到这一点,我将建议在整个应用程序中始终使用EV SSL证书,并对文件(jpeg、pdf、txt)应用某种加密,以确保如果有人在服务器级别访问了应用程序,没有应用程序也无法直接查看文件,这就是我寻求建议或改进的地方 我的研究指导我对文件

我正在研究和开发一个可能的项目,我的潜在客户正在与我讨论

我正在考虑创建一个asp.NET4.5Web应用程序,它将通过web访问并保存一些非常敏感的信息。这些信息将通过webApp和存储在服务器上的文件上传,以便以后查看/检索。我想确保信息安全地上传和存储。为了做到这一点,我将建议在整个应用程序中始终使用EV SSL证书,并对文件(jpeg、pdf、txt)应用某种加密,以确保如果有人在服务器级别访问了应用程序,没有应用程序也无法直接查看文件,这就是我寻求建议或改进的地方

我的研究指导我对文件进行AES加密,同样,这是否足以保护文件?是否应在操作系统级别(win2008)应用加密?我应该将文件存储在数据库中吗

这些文件必须在webApp上对用户可读,并在浏览器中可见


如果需要任何进一步的信息,请询问

我在一个项目中,该项目也处理一些非常敏感的信息/文件。我们决定

  • 使用https
  • 使用ssl证书加密所有敏感数据/文件
  • 现在我们不在数据库中保存文件,尽管这是可能的。但我不认为将其保存到数据库有什么大的好处(文件的备份将单独进行,这可能是应用程序中的一个要点)。有关在数据库中保存文件的利弊,请参见

    这里有一个关于如何在上使用X509证书进行加密的
    示例,网上有很多关于这个主题的好文章(,…)


    虽然这是我们的做法,但可能有更好的解决办法。我想听听你选择哪种方法。

    如果你使用私钥加密来保护文件,你仍然有一个问题,那就是密钥必须在你的源代码中的某个地方。我想到的两个备选方案是:

  • 公钥加密-使用嵌入在dll中的公钥加密数据,并且计算机上没有私钥。然后,在解密之前,您将把文件带到其他地方
  • 使用用户级密钥对数据进行加密。然后就没有显式的密钥需要管理,数据只能由作为该用户运行的进程读取(因此您可能会将应用程序池更改为使用计算机帐户运行)

  • 由于您使用的是SSL,传输数据将已经加密。基本上,SSL握手完成后,数据将使用AES等算法进行对称加密。这主要是为了提高速度,公钥加密非常慢,因此使用RSA等算法加密文件可能不是一个好主意,此外,现在很多英特尔处理器都支持AES,因此使用它会非常快(这就是BitLocker的基础)

    您现在面临的问题是一个经典的密钥管理问题,即如何在不影响安全性的情况下安全地存储和分发密钥?您可以做的一件事是基于用户密码+salt创建一个密钥,这样您的应用程序(在对用户进行身份验证后)就可以使用一种算法重新生成密钥,该算法基于用户密码+一些随机salt值,并将其保留在会话中。只有用户才能解密他们上传到系统中的数据。这样做的一个好的副作用是,用户现在也无法读取其他用户的数据。但是,这样做有一个缺点,即如果用户松开密码,密钥及其文件将无法恢复。通常,在这些情况下,您要做的是进行某种密钥托管,其中有一个受信任的第三方可以使用主密码存储和加密所有密钥,或者您是受信任的一方,使用某个主密钥加密所有密钥,该主密钥不属于您的应用程序,并且存储在单独的安全系统上。另一个缺点是,当用户更改密码时,您必须解密并重新加密文件系统上的所有数据,这可能是一个漫长的过程,具体取决于存储的数据量


    不管这些,如果你遇到钥匙被偷的情况,你应该保持某种应急计划。设计应用程序的一个很好的起点是查看OWASP(开放式Web应用程序安全项目)中的设计元素

    在我看来,只有在上传之前进行加密,才能确保安全。我可以想到很多可能的中间人攻击。您可以尝试客户端加密:这可能是一个很好的起点。您试图解决的问题的解决方案值得怀疑。如果攻击者能够访问服务器,他可以轻松解密数据(因为加密/解密代码位于服务器上,可以直接运行)。考虑寻找和交谈那些对安全有很好理解的人来验证你的方法。对于startes,请阅读Eric Lipperts关于加密的博客,就像我不喜欢在数据库中存储文件一样。首选将文件放在文件系统中。您的文件加密方法是什么?正如我所说的,我们使用ssl证书加密所有文件。此外,文件将获得存储在数据库中的动态生成的文件名以及原始文件名。在传输的文件,他们得到了解密和文件名是从数据库还原!