Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security mvc4中的加密与解密_Security_Asp.net Mvc 4 - Fatal编程技术网

Security mvc4中的加密与解密

Security mvc4中的加密与解密,security,asp.net-mvc-4,Security,Asp.net Mvc 4,假设我有一个表单,人们在其中输入信息,如信用卡号码和asp.net MVC 4中的其他敏感信息。我有一个模型类,它将有实体对象,视图将呈现适当的文本框或编辑器来输入这些信息。然后,当用户单击submit按钮时,将调用action方法并捕获信息并发送到服务器进行存储。我想在数据来自客户端时对数据进行加密,以便对其进行保护?怎么做 我知道如果我在控制器类中使用[RequiresHttps]属性,它将使用服务器中安装的证书建立安全连接?你能解释一下这是怎么回事吗 另外,以安全的方式将数据从客户端发送到

假设我有一个表单,人们在其中输入信息,如信用卡号码和asp.net MVC 4中的其他敏感信息。我有一个模型类,它将有实体对象,视图将呈现适当的文本框或编辑器来输入这些信息。然后,当用户单击submit按钮时,将调用action方法并捕获信息并发送到服务器进行存储。我想在数据来自客户端时对数据进行加密,以便对其进行保护?怎么做

我知道如果我在控制器类中使用[RequiresHttps]属性,它将使用服务器中安装的证书建立安全连接?你能解释一下这是怎么回事吗

另外,以安全的方式将数据从客户端发送到服务器的最佳方式是什么?还有其他更简单的技术吗?你能解释一下加密和解密是如何解决这个问题的吗

提前谢谢。顺便说一句,我是这项技术的新手


谢谢

您需要做的第一件事是安装来自受信任机构(如VeriSign、GeoTrust、Thawte等)的SSL证书。。。这将保护客户端和服务器之间的通信。你可以在维基百科上阅读更多关于HTTPS的信息

然而,这不会给你安全感。您需要从网络级别确保您的web服务器是安全的,这将包括确保服务器本身有防火墙和正确的安全过程。作为一名web开发人员,您最值得信赖的人将是您公司的网络安全管理员(我认为所有开发人员都应该学会自己做这件事,这样他们才知道发生了什么)

您仍然需要保护您的应用程序。我的建议是永远不要在系统中存储信用卡号。你这样做只是自找麻烦。例如,如果您将它们存储在数据库中(即使已加密),并且您的应用程序易受SQL注入攻击,则您可能会将所有客户的信用卡号暴露给攻击者。即使是加密的,也不要认为你是安全的,因为你必须记住很多与加密有关的事情,包括但不限于:

  • 实际加密是加密中最简单的部分有 有很多好的算法可供选择
  • 最难的部分是密钥管理
  • 很多加密算法都有一定的局限性
  • 你可能不会选择一个能给你很好熵的键(P@$$单词很容易猜)
  • 如何安全地存储密钥?如果您的应用程序易受攻击,黑客可能很容易将其从服务器上删除
  • 即使你做的一切都是对的,如果网络管理员或其他开发人员决定作恶并窃取你的密钥和数据库,会发生什么?(对不起,网络管理员和其他开发人员)
  • 如果您使用Authorize.NET、Paypal等支付网关。。。您可以处理信用卡而无需存储它。当您的控制器接收到它时,您只需调用一个服务(通常只是通过HTTPS进行的XML调用),得到结果后,就可以忘记信用卡曾经到过您这里。您可以存储他们返回的交易编号,以防您以后需要作废或退款交易,或者如果您想在以后执行一次和一次捕获


    他们甚至提供了用代币存储信用卡的机制,并进行自动循环计费。例如Authorize.NET的高级集成方法

     public static class lockIt
        {
            public static string EncryptString(string ClearText)
            {
                byte[] clearTextBytes = Encoding.UTF8.GetBytes(ClearText);
                System.Security.Cryptography.SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
                MemoryStream ms = new MemoryStream();
    
                string key1 = "aaaaaaaaaaaaaaaa";
                string key2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    
                byte[] rgbIV = Encoding.ASCII.GetBytes(key1);
                byte[] key = Encoding.ASCII.GetBytes(key2);
                CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
                cs.Write(clearTextBytes, 0, clearTextBytes.Length);
                cs.Close();
                return Convert.ToBase64String(ms.ToArray());
            }
    
            public static string DecryptString(string EncryptText)
            {
                byte[] encryptedTextBytes = Convert.FromBase64String(EncryptText);
                MemoryStream ms = new MemoryStream();
                System.Security.Cryptography.SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
    
                string key1 = "aaaaaaaaaaaaaaaa";
                string key2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    
                byte[] rgbIV = Encoding.ASCII.GetBytes(key1);
                byte[] key = Encoding.ASCII.GetBytes(key2);
                CryptoStream cs = new CryptoStream(ms, rijn.CreateDecryptor(key, rgbIV), CryptoStreamMode.Write);
                cs.Write(encryptedTextBytes, 0, encryptedTextBytes.Length);
                cs.Close();
                return Encoding.UTF8.GetString(ms.ToArray());
            }
    
            public static string EnString(string instring)
            {
                return EncryptString(EncryptString(instring));
            }
    
            public static string DeString(string outstring)
            {
                return DecryptString(DecryptString(outstring));
            }
    

    问题是,您需要使用SSL证书来加密所有通信,使用带有安全密钥的数据库加密来加密CC信息和客户数据,并锁定服务器上不必要的端口和访问点,等等,但这还不够。如果您在服务器上以不完全符合PCI的方式存储CC信息,那么如果有泄漏,您可能会被起诉,如果您不熟悉服务器和软件安全以及PCI要求,这是一种真正的可能性。为什么不直接使用Stripe这样的第三方服务呢?