【问题标题】:Encrypt Query String including keys加密查询字符串,包括密钥
【发布时间】:2012-02-25 00:04:29
【问题描述】:

我有一个应用程序使用查询字符串在页面周围传递一些值。我发现了一些关于如何加密查询字符串中的值的示例,但问题是我的 KEYS 更多地了解了查询字符串,然后是所有整数转换为字符串的值。

有没有办法加密 ASP.NET 中的整个查询字符串,包括键和键值?

类似:

Default.aspx?value1=40&value2=30&value3=20

 Default.aspx?56sdf78fgh90sdf4564k34klog5646l

谢谢!

【问题讨论】:

  • 网上至少有10个不同的例子
  • @Aristos 那篇文章实际上是在询问是否只加密 ,而这篇文章似乎是关于加密整个字符串。
  • @AndrewBarber 答案包含完整的网址。反正我觉得这个用户很懒,google上有10万条关于这个的结果。
  • 感谢各位的帮助,我试过了,但找不到关于代码示例的文章,您可以在其中使用自定义密钥加密整个字符串。只写了一半的文章。

标签: c# asp.net encryption query-string


【解决方案1】:

上面的许多参考资料都忽略了一个问题,那就是在返回加密字符串之前,URL 编码(在字符串返回之前见下文)。我使用的是 IIS 7.5,它会自动为你“解码”字符串,所以解密“应该”没问题。加密和解密代码如下所示。

public string EncryptQueryString(string inputText, string key, string salt)
{
    byte[] plainText = Encoding.UTF8.GetBytes(inputText);

    using (RijndaelManaged rijndaelCipher = new RijndaelManaged())
    {
        PasswordDeriveBytes secretKey = new PasswordDeriveBytes(Encoding.ASCII.GetBytes(key), Encoding.ASCII.GetBytes(salt));
        using (ICryptoTransform encryptor = rijndaelCipher.CreateEncryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(plainText, 0, plainText.Length);
                    cryptoStream.FlushFinalBlock();
                    string base64 = Convert.ToBase64String(memoryStream.ToArray());

                    // Generate a string that won't get screwed up when passed as a query string.
                    string urlEncoded = HttpUtility.UrlEncode(base64);
                    return urlEncoded;
                }
            }
        }
    }
}

public string DecryptQueryString(string inputText, string key, string salt)
        {
            byte[] encryptedData = Convert.FromBase64String(inputText);
            PasswordDeriveBytes secretKey = new PasswordDeriveBytes(Encoding.ASCII.GetBytes(key), Encoding.ASCII.GetBytes(salt));

            using (RijndaelManaged rijndaelCipher = new RijndaelManaged())
            {
                using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
                {
                    using (MemoryStream memoryStream = new MemoryStream(encryptedData))
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                        {
                            byte[] plainText = new byte[encryptedData.Length];
                            cryptoStream.Read(plainText, 0, plainText.Length);
                            string utf8 = Encoding.UTF8.GetString(plainText);
                            return utf8;
                        }
                    }
                }
            }
        }

【讨论】:

  • 我有输入字符串,我有盐,什么是“关键”?我正在尝试使用此代码,因为当加密中有加号“+”时,我使用的代码无法解密
【解决方案2】:

网上有很多例子。

其中一些:

How can I encrypt a querystring in asp.net?

how to pass encrypted query string in asp.net

http://www.codeproject.com/Articles/33350/Encrypting-Query-Strings

http://www.keyvan.ms/how-to-encrypt-query-string-parameters-in-asp-net

http://forums.asp.net/t/989552.aspx/1

现在你说你也喜欢加密密钥,实际上你要做的就是加密它们所有的 url 行,然后你只需 阅读 RawUrl 之后的内容是什么?并解密

【讨论】:

  • 我尝试了 www.4guysfromrolla.com 但链接似乎已失效,该链接指向该站点上的源。无论如何,这完全回答了我的问题。这种查询字符串加密的实现是最容易使用的,并且可以满足我的所有需求:madskristensen.net/post/…
  • @user1010609 您的问题的答案是:它只是一个使用 UrlEncoded 和 UrlDecode 加密的脚本。
  • @reaz 我不这么认为,在 4 年前,我知道如何连接来解决问题
  • 这些都是危险的错误,你必须永远重用初始化向量,参见例如cryptofails.com/post/70059609995/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2010-11-22
  • 2023-04-04
相关资源
最近更新 更多