【问题标题】:How to encrypt/decrypt the url in C#如何在 C# 中加密/解密 url
【发布时间】:2011-02-27 07:38:28
【问题描述】:

我有一个网址 www.site-address/site-page/page1.aspx?username=deepu&password=deepu 如何将 URL 更改为 www.site-address/site-page/page1.aspx?username=232322323232&password=2323232322323 即我想加密我通过URL传递的字段请帮助我使用.net在C#中加密和解密URL,现在我正在使用response.redirect并将这些值作为查询字符串传递......请帮助...... .

【问题讨论】:

标签: c# asp.net url-rewriting


【解决方案1】:

它不会按照你想要的方式工作,但是可以通过下面提到的方式进行加密

加密页面:

string id1 = "id1";

Response.Redirect("decryptionPage.aspx?id1=" + HttpUtility.UrlEncode(Encrypt(id1)));

private string Encrypt(string stringToEncrypt)
{
        byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
        byte[] rgbIV = { 0x21, 0x43, 0x56, 0x87, 0x10, 0xfd, 0xea, 0x1c };
        byte[] key = { };
        try
        {
            key = System.Text.Encoding.UTF8.GetBytes("A0D1nX0Q");
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Convert.ToBase64String(ms.ToArray());
        }
        catch (Exception e)
        {
            return e.Message;
        }
}

解密页面:

string getId1 = Convert.ToString(Request.QueryString["id1"]);
var qs = Decrypt(HttpUtility.UrlDecode(getId1));
private string Decrypt(string EncryptedText)
{
        byte[] inputByteArray = new byte[EncryptedText.Length + 1];
        byte[] rgbIV = { 0x21, 0x43, 0x56, 0x87, 0x10, 0xfd, 0xea, 0x1c };
        byte[] key = { };

        try
        {
            key = System.Text.Encoding.UTF8.GetBytes("A0D1nX0Q");
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            inputByteArray = Convert.FromBase64String(EncryptedText);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, rgbIV), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            System.Text.Encoding encoding = System.Text.Encoding.UTF8;
            return encoding.GetString(ms.ToArray());
        }
        catch (Exception e)
        {
            return e.Message;
        }
}

【讨论】:

  • 我正在寻找一个类似的问题并遇到了您的代码。它工作得非常好,但是Encrypt 方法生成的字符在添加到 URL 时会替换为空格(例如+)。所以,Decrypt 方法不会像我预期的那样工作。有什么办法解决吗??
【解决方案2】:

您的方法存在缺陷,加密并不能真正解决根本问题。如果您通过网络出去,您将很少(不应该)看到像您所描述的那样的模式,即使它是加密的。

相反,您应该将用户凭据尽可能安全地存储在服务器上,并在查询字符串中传递一个唯一的、短暂的会话令牌,您可以使用它来查找凭据。

至于在服务器上安全存储,一旦您第一次收到用户密码,您应该使用带盐的单向哈希,例如 SHA256。您可以将此值传递到任何地方,存储它,并验证将潜在密码与您存储的哈希值进行比较。将用户的密码视为有毒废物 - 尽快将其丢弃。您希望从事密码存储业务的程度与从事有毒废物存储业务的业务一样糟糕。

(通过我的 iPhone 回答,链接即将发布,或者如果有人想帮助我!:))

【讨论】:

  • 感谢您的回答,,,我需要将一些数据传递到另一个页面..如果我通过 url,,我不希望客户看到提交的值..任何加密形式都是可能的..我不是说我想要这个表格...
  • @deepu 答案是“不要那样做”。这是非常危险的。
  • okz ..那么我怎样才能将一些值传递到另一个页面...除了 server.transfer 方法..
  • @deepu 正如我在回答中所说 - 将凭证信息存储在数据库、会话或服务器上的其他位置,并通过查询字符串传递令牌 ID - 在目标页面上使用再次查找信息的令牌。
  • +1 表示“您希望从事密码存储业务,就像您希望从事有毒废物存储业务一样糟糕。”
【解决方案3】:

你真的想这样做吗?如果您为用户名和密码烦恼,那么您提供的信息或功能可能会有一些价值。通过 URL 参数传递,您可以打开许多攻击面(尤其是任何人都可以冒充您的用户的重放攻击。

你真正想做什么,为什么不能使用what's provided in ASP.NET

【讨论】:

  • 我同意。将凭据存储在查询字符串中是非常糟糕的形式,即使它是加密的。有人很容易拦截查询字符串并冒充用户。
  • yh...我需要将一些数据传递到另一个页面..如果我通过 url,我不希望客户端看到提交的值..这就是我认为的加密值和传递是可能的......那里有任何简单的方法......
  • 您不必传递用户名/密码!听说过会议吗?如果您只查看 MSFT 的建议,这将自动为您处理。一定要看看标准的 ASP.NET 身份验证机制,我敦促你!
【解决方案4】:

为什么不发布值而不是使用查询字符串?使用 SSL 至少没有人会看到加密或其他方式的密码。 URL 中的附加密码不提供任何安全性。这就像把你家的钥匙散落在附近,并希望没有人会尝试用它们来打开你的房子。

基本上这是一个有缺陷的前提。网址以多种方式缓存,因此不要将密码放入其中是有意义的。

但是,在 URL 中输入密码的并非只有您一个人。看看这个

http://support.microsoft.com/kb/135975

【讨论】:

  • 是的,当然,当你必须从一个页面发送密码到另一个页面时,你应该使用post方法,它可以用于在页面中使用基于查询字符串的某些值的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多