0

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

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

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

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

谢谢

4

2 回答 2

2

您需要做的第一件事是从受信任的权威机构(例如 VeriSign、GeoTrust、Thawte 等)安装 SSL 证书……这将保护客户端和服务器之间的通信。您可以在 Wikipedia http://en.wikipedia.org/wiki/HTTP_Secure上阅读有关 HTTPS 的更多信息

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

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

  1. 实际的加密是加密中最简单的部分,有很多好的算法可供选择。
  2. 最难的部分是密钥管理
  3. 很多加密算法都有一定的弱密钥
  4. 您可能不会选择能给您带来良好熵的密钥(P@$$word 很容易猜到)
  5. 您如何安全地存储您的密钥?如果您的应用程序容易受到路径遍历攻击,那么黑客可能很容易将其从您的服务器上取下来
  6. 即使您做对了所有事情,如果网络管理员或其他开发人员决定作恶并窃取您的密钥和数据库,会发生什么?(对不起网络管理员和其他开发人员)

如果您使用 Authorize.NET、Paypal 等支付网关...您可以处理信用卡而不需要存储它。当您的控制器接收到它时,您只需调用服务(通常只是通过 HTTPS 进行的 XML 调用),然后在得到结果后就忘记曾经来过您的信用卡。您可以存储他们返回的交易编号,以防您以后需要取消或退还交易,或者如果您想先进行授权保留,然后再进行捕获。

他们甚至提供了使用令牌存储信用卡并进行自动定期计费的机制。例如 Authorize.NET 的高级集成方法https://developer.authorize.net/api/aim/ http://www.authorize.net/support/AIM_guide.pdf

于 2013-07-02T01:11:36.103 回答
0

这个加密和解密示例

 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));
        }
于 2013-07-02T09:58:29.887 回答