【问题标题】:UrlEncoding Plus(+) in URL in ASP.NetASP.Net 中 URL 中的 UrlEncoding Plus(+)
【发布时间】:2010-09-28 07:26:39
【问题描述】:

我正在加密和 Base64 字符串。一切都很好,直到我从 QueryString 集合中检索到加密字符串。加密文本包含一个加号。当我检索加密字符串时,曾经有一个加号的地方现在有一个空格。正如您可以想象的那样,这不会解密。

我已尝试过 Server.HtmlEncode/HtmlDecode 和 Server.UrlEncode/Server.UrlDecode 均无济于事。这两种方法都将加号和空格混淆了。

有什么想法吗?

这是一个类似的帖子:QueryString Malformed

编辑: 我找到了解决方案:Server.UrlEncode 确实有效,我正在应用 Server.UrlDecode 并且不需要。

【问题讨论】:

    标签: asp.net url


    【解决方案1】:

    请注意,将“+++”替换为“==”的方法很危险,因为在极少数情况下,加密的查询字符串可能有效地包含“+++”。在这种情况下,解密失败。为了更好地解决该问题,请查看使用“修改后的 base64 for url”。它涉及将“-”替换为“+”,将“_”替换为“/”,并且没有“==”填充。它似乎对我们有用,即使在对方失败的情况下也是如此。这是我用作参考的链接,它对我们有用。

    Code for decoding/encoding a modified base64 URL

    【讨论】:

      【解决方案2】:

      几年前我也遇到过像你这样的问题。这是我将base64查询字符串解码为字符串的代码,反之亦然

          public static String DoDecryption(String Value)
          {
              Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes );
              dec.IV = Encoding.ASCII.GetBytes("funky");
              byte [] DecValue =  Convert.FromBase64String(Value.Replace("+++","=="));
              byte [] DecKey   = Encoding.ASCII.GetBytes("0123456789012345");
              byte [] DecipherValue = dec.Decrypt(DecValue,DecKey);
              return Encoding.ASCII.GetString(DecipherValue);
          }
      

      这里是加密部分

          public static String DoEncryption(String Value)
          {
              Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes);
              byte [] EncValue =  Encoding.ASCII.GetBytes(Value);
              byte [] EncKey   = Encoding.ASCII.GetBytes("0123456789012345");
              enc.IV = Encoding.ASCII.GetBytes("funky");
              byte [] CipherValue = enc.Encrypt(EncValue,EncKey);
              //InitVector = Encoding.ASCII.GetString(enc.IV);
              return Convert.ToBase64String(CipherValue).Replace("==","+++");
          }
      

      注意DoEncryption中的Value参数是你要加密成查询字符串的字符串,DoDecryption中的value参数是已经转换成base64字符串的查询字符串。

      希望对你有帮助

      【讨论】:

      • 我添加了另一个答案。请注意这一点,因为“+++”在加密字符串的中间有效。
      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多