【问题标题】:Simple string encryption in .NET and Javascript.NET 和 Javascript 中的简单字符串加密
【发布时间】:2010-10-19 06:46:18
【问题描述】:

我正在开发一个 ASP.NET MVC 应用程序,我想在其中使用 C# 在服务器上加密一个短字符串,并将其发送到客户端。

然后在客户端通过Javascript代码解密。

关于如何实现这个有什么想法吗?

您是否知道可以轻松地从 C# 转换为 Javascript 或反之亦然的简单加密算法(不一定是防弹安全的)?

注意:我可以完全在 C# 中执行此操作并通过 Ajax 执行解密,但我不希望这样做,因为我想尽可能减少网站流量。

【问题讨论】:

    标签: c# .net javascript string encryption


    【解决方案1】:

    非常简单的函数,

    function Encrypt(value) 
    {
      var result="";
      for(i=0;i<value.length;i++)
      {
        if(i<value.length-1)
        {
            result+=value.charCodeAt(i)+10;
            result+="-";
        }
        else
        {
            result+=value.charCodeAt(i)+10;
        }
      }
      return result;
    }
    function Decrypt(value)
    {
      var result="";
      var array = value.split("-");
    
      for(i=0;i<array.length;i++)
      {
        result+=String.fromCharCode(array[i]-10);
      }
      return result;
    } 
    

    【讨论】:

      【解决方案2】:

      听起来您想要混淆或编码,而不是加密。 Base64 encoding 在这里应该可以正常工作。结果看起来一点也不像电子邮件地址,而且编码过程很快。

      在 C# 中,您可以使用:

      string emailAddress = "abc@example.com";
      string encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(emailAddress));
      

      您可以使用这个 JavaScript 函数对其进行解码:

      function Base64Decode(encoded) {
         var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
         var output = "";
         var chr1, chr2, chr3;
         var enc1, enc2, enc3, enc4;
         var i = 0;
      
         do {
            enc1 = keyStr.indexOf(encoded.charAt(i++));
            enc2 = keyStr.indexOf(encoded.charAt(i++));
            enc3 = keyStr.indexOf(encoded.charAt(i++));
            enc4 = keyStr.indexOf(encoded.charAt(i++));
      
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
      
            output = output + String.fromCharCode(chr1);
      
            if (enc3 != 64) {
               output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
               output = output + String.fromCharCode(chr3);
            }
         } while (i < encoded.length);
      
         return output;
      }
      

      C# 应用程序将字符串abc@example.com 编码为YWJjQGV4YW1wbGUuY29t,而JavaScript 版本将YWJjQGV4YW1wbGUuY29t 解码回abc@example.com。

      【讨论】:

        【解决方案3】:

        System.Security.Cryptography 有一堆可以使用的对称(和非对称)加密算法。 (对于超级安全的东西,请使用aes)

        您应该能够找到大多数匹配的 Javascript 实现(这里有一些 JS 中的 aes 实现)

        注意:如果您打算使用基于私钥的加密,请记住,您的网页将嵌入密钥,这意味着这一切都变得毫无意义,因为任何有权访问该页面的人都可以进行解密,充其量只会使屏幕刮板的使用寿命变得更加困难。如果你的目标是让屏幕刮板更难,你可以使用混淆算法。对于没有 javascript 引擎的屏幕抓取工具,任何微不足道的实现都是非常不切实际的:

        例如。

        function samObsfucated()
        {
            return("s" + "a" + "m" + "@" + "s" + "." + "com");
        }
        

        然后 onload 使用这些函数的输出填充您的电子邮件字段。

        Javascript 加密对于存储用户密码的软件有一个非常好的用例 ala clipperz

        【讨论】:

          【解决方案4】:

          简单的XOR Cipher怎么样?

          这两种实现完全兼容:

          【讨论】:

            【解决方案5】:

            就可能可行的最简单的事情而言,您似乎想要一种简单的混淆形式,而不是任何真正安全的东西。

            Rot-13 可能就足够了,前提是您要与使用 ASCII 电子邮件地址的受众打交道。如果您需要支持 Unicode,那么您可能需要一些更复杂的东西。

            【讨论】:

              【解决方案6】:

              您可以使用 HTTPS 加密客户端和服务器之间的所有流量吗?这可能是您能找到的最安全的方法。

              【讨论】:

              • 我宁愿不使用 HTTPS,因为这只是一个简单的“小册子”网站,而我加密的只是电子邮件地址,以防垃圾邮件。我不想经历设置 HTTPS 的麻烦。
              • 那时你想保护谁的数据?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-10
              • 2017-02-28
              • 2012-10-13
              • 2012-10-29
              • 2017-10-08
              相关资源
              最近更新 更多